在JSDoc的@param
类型声明中是否可以像下面的例子一样使用enum?
/**
* @enum { Number }
*/
const TYPES = {
TYPE_A: 1,
TYPE_B: 2
}
/**
* @param { TYPES } type
*/
function useTypesEnum( type ) {
}
如果我像使用Eclipse等IDE来编写JavaScript,那么不应该会出现任何警告吗?
在JSDoc的@param
类型声明中是否可以像下面的例子一样使用enum?
/**
* @enum { Number }
*/
const TYPES = {
TYPE_A: 1,
TYPE_B: 2
}
/**
* @param { TYPES } type
*/
function useTypesEnum( type ) {
}
如果我像使用Eclipse等IDE来编写JavaScript,那么不应该会出现任何警告吗?
@typedef
结合使用? - jakubiszon@param {'choice1'|'choice2'} type
。 (注:该方法接受一个名为“type”的参数,可以是字符串“choice1”或“choice2”中的任意一个) - tehmas看起来这是在没有任何警告的情况下记录所有内容的正确方式。
/**
* @typedef {number} MyType
**/
/**
* @enum {MyType}
*/
var TYPES = {
TYPE_A: 1,
TYPE_B: 2
}
/**
* @param {MyType} type
*/
function useTypesEnum( type ) {
}
这意味着:
在 intellij 2017.1 上对我有效。
然而 - 这仍将允许每个字符串传递给函数而没有警告。
如果您想指定枚举值,以便如果使用了另一个字符串则应引发错误,请使用以下方法:https://dev59.com/sJXfa4cB1Zd3GeqPlNsQ#36501659
/**
* @typedef FieldType
* @property {string} Text "text"
* @property {string} Date "date"
* @property {string} DateTime "datetime"
* @property {string} Number "number"
* @property {string} Currency "currency"
* @property {string} CheckBox "checkbox"
* @property {string} ComboBox "combobox"
* @property {string} Dropdownlist "dropdownlist"
* @property {string} Label "label"
* @property {string} TextArea "textarea"
* @property {string} JsonEditor "jsoneditor"
* @property {string} NoteEditor "noteeditor"
* @property {string} ScriptEditor "scripteditor"
* @property {string} SqlEditor "sqleditor"
*/
MyType
成为 number
。这将确保您发送的内容与枚举值具有相同的类型,但如果您传递未知值,它不会引发错误。在此情况下,useTypesEnum(3)
不会引发错误,但应该会引发错误。 - Mark我使用以下内容:
const TYPES = {
0: "TYPE_A",
1: "TYPE_B"
}
/**
* @param {keyof TYPES} type
*/
function useTypesEnum(type) {
// ...
}
这在VSCode中显示了正确的值作为建议。它易于阅读,给开发人员提供了哪个值表示什么的线索,并且枚举值可以在运行时使用。
如果我不需要在运行时使用TYPES
的值,我甚至更喜欢将TYPES
用作@typedef
:
/**
* @typedef {{
* 0: "TYPE_A",
* 1: "TYPE_B"
* }} TYPES
*/
/**
* @param {keyof TYPES} type
*/
function useTypesEnum(type) {
// ...
}
如果枚举的值应该被使用,或者由于任何原因需要翻转枚举的键和值,则可以使用valueOf<T>
助手。缺点是,在VSCode中它不提供自动完成。但至少函数的参数定义在某种程度上是可读的。
/**
* @typedef {T[keyof T]} valueOf<T>
* @template T
*/
const TYPES = {
"TYPE_A": 0,
"TYPE_B": 1
};
/**
* @param {valueOf<TYPES>} type
*/
function useTypesEnum(type) {
// ...
}
/** @type {const} */ ({ 0: "TYPE_A", 1: "TYPE_B" })
进行类型转换为只读,但是这太冗长了。 - vintproximport * as someEnum from ''some-enum.js'
导入,这也是可行的。 - Hibou57不幸的是,我找到的唯一方法是定义另一个type
(@typedef
):
/**
* @enum { number }
*/
const TYPES = {
TYPE_A: 1,
TYPE_B: 2
}
/** @typedef {'TYPE_A'|'TYPE_B'} TYPES_KEYS */
/**
* @param { TYPES_KEYS } input
*/
function useTypesEnum(input) {
// ...
}
JSDoc注释对JavaScript代码没有影响。它影响的是一些旨在使用该信息的工具。与JSDoc注释一起使用的两个工具是文档生成器和Google Closure Compiler。
我对JSDoc 3不是特别熟悉,其中添加了@enum
标签,但我认为它的工作方式与其他任何类型相同。
Closure Compiler也正确识别了enum
,您可以像示例中提到的那样使用它,并获得编译器的所有好处(例如:类型检查)。
TYPESSS
代替@param
。 - BuZZ-dEE