繁体   English   中英

JSDoc 中作为@param 类型的枚举

[英]Enum as @param type in JSDoc

是否可以像以下示例一样为 JSDoc @param类型声明使用枚举?

/**
 * @enum { Number }
 */
const TYPES = {
    TYPE_A: 1,
    TYPE_B: 2
}

/**
 * @param { TYPES } type
 */
function useTypesEnum( type ) {
    
}

如果我为 JavaScript 使用 Eclipse 等 IDE,是否应该不会发出警告?

您可以通过执行以下操作来实现:

/**
* @param {(1|2)} type
*/
function useTypesEnum(type) {

}

在此处输入图像描述

因此,这似乎是在没有任何警告的情况下记录所有内容的正确方法

/**
 * @typedef {number} MyType
 **/


/**
 * @enum {MyType}
 */
var TYPES = {
    TYPE_A: 1,
    TYPE_B: 2
}

/**
 * @param {MyType} type
 */
function useTypesEnum( type ) {

}

这表示:

  • MyType 是一个数字
  • TYPES 是一个包含 MyType 值的枚举
  • 此函数接受输出 MyType 值的枚举

在 intellij 2017.1 上为我工作

但是 - 这仍然允许将每个字符串传递给函数而不会发出警告。

如果您也想指定枚举值 - 如果使用另一个字符串,它应该会引发错误,请使用以下描述的方法: https ://stackoverflow.com/a/36501659/1068746

 /**
    * @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"
    */

我使用以下内容:

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) {
    // ...
}

建议2截图

不幸的是,我发现的唯一方法是定义另一种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标记,但我认为它与任何其他类型一样工作。

闭包编译器还可以正确识别enum ,您可以像示例中提到的那样使用它并获得编译器的所有好处(例如:类型检查)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM