Enum como tipo @param en JSDoc

5 minutos de lectura

Avatar de usuario de BuZZ-dEE
zumbido-dEE

¿Es posible usar una enumeración para el JSDoc? @param declaración de tipo como en el siguiente ejemplo?

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

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

Si uso un IDE como Eclipse, etc. para JavaScript, ¿no debería aparecer ninguna advertencia?

  • ¿Has probado? ¿Qué pasó?

    – Xotic750

    11 de febrero de 2014 a las 13:02

  • Si, pero solo en jsfiddle. Funciona, también si uso TYPESSS para @param.

    – ZUMBIDO-dEE

    11 de febrero de 2014 a las 13:22


Puedes lograr eso, haciendo esto:

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

}

ingrese la descripción de la imagen aquí

  • Muchas gracias, esto era lo que estaba buscando y debería ser la respuesta aceptada.

    – Ieuán

    22 de septiembre de 2020 a las 3:26

  • ¡No sabría decirte cómo me alegraste el día, Leuan!

    – Ahmed Mahmud

    22 de septiembre de 2020 a las 11:21


  • ¿Se podría combinar con @typedef ?

    – jakubiszon

    20 de mayo de 2021 a las 23:18

  • para mí esto funcionó: @param {'choice1'|'choice2'} type

    – temas

    12 de julio de 2021 a las 7:04

  • ¿Qué pasa si, en algún momento, la enumeración subyacente cambia?

    –David Vitali

    4 de mayo de 2022 a las 10:07

avatar de usuario de guy mograbi
tipo mograbi

Entonces parece que esta es la forma correcta de documentar todo sin previo aviso.

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


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

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

}

Esto significa:

  • MiTipo es un número
  • TYPES es una enumeración que contiene valores MyType
  • Esta función acepta enumeraciones que generan valores MyType

Funciona para mí en intellij 2017.1

Sin embargo, esto aún permitirá que cada cadena se pase a la función sin advertencias.

Si también desea especificar los valores de enumeración, por lo que debería generar errores si se usó otra cadena, use el método descrito en: 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"
    */

  • Esta solución da como resultado MyType ser number. Esto asegurará que está enviando algo que es del mismo tipo que los valores de la enumeración, pero no generará errores si pasa valores desconocidos. useTypesEnum( 3 ) no generaría un error aquí, pero debería.

    – Marca

    2 de marzo de 2022 a las 18:37

avatar de usuario de miile7
miile7

Yo uso lo siguiente:

const TYPES = {
    0: "TYPE_A",
    1: "TYPE_B"
}

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

Esto muestra los valores correctos como sugerencia en VSCode. Es muy legible, brinda a los desarrolladores una pista sobre qué valor representa qué y los valores de enumeración se pueden usar en tiempo de ejecución.

Captura de pantalla de sugerencia


Si no necesito los valores de TYPES en tiempo de ejecución, incluso prefiero usar el TYPES como un @typedef:

/**
 * @typedef {{ 
 *     0: "TYPE_A",
 *     1: "TYPE_B"
 * }} TYPES
 */

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

Si el valor de la enumeración debe usarse, o las claves y valores de enumeración debe ser volteado por cualquier razón, yo uso el valueOf<T> ayudante. La desventaja es que esto no ofrece autocompletado en VSCode. Pero al menos la definición de parámetros de funciones es, hasta cierto punto, legible.

/**
 * @typedef {T[keyof T]} valueOf<T>
 * @template T
 */

const TYPES = {
    "TYPE_A": 0,
    "TYPE_B": 1
};

/**
 * @param {valueOf<TYPES>} type
 */
function useTypesEnum(type) {
    // ...
}

Sugerencia 2 captura de pantalla

  • La respuesta más útil y segura que está actualizada. Si los valores requieren una coincidencia más estricta, la supuesta enumeración de objetos se puede convertir a solo lectura a través de /** @type {const} */ ({ 0: "TYPE_A", 1: "TYPE_B" })pero sí, es demasiado detallado.

    – vintprox

    13 de diciembre de 2022 a las 11:02


  • También funciona si TIPOS es un módulo, importado como import * as someEnum from ''some-enum.js'.

    – Hibou57

    13 de marzo a las 13:07

Avatar de usuario de Mir-Ismaili
Mir-Ismaili

Desafortunadamente, la única forma que encontré es definir otra 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) {
  // ...
}

Avatar de usuario de Tibos
Tibos

Los comentarios de JSDoc no tienen impacto en el código JavaScript. Lo que sí influye son algunas herramientas diseñadas para usar esa información. Dos de las herramientas que funcionan con los comentarios de JSDoc son el generador de documentación y el compilador de cierre de Google.

No estoy particularmente familiarizado con JSDoc 3, en el que el @enum Se ha agregado la etiqueta, pero supongo que funciona como cualquier otro tipo.

Closure Compiler también reconoce el enum correctamente y puede usarlo tal como lo mencionó en el ejemplo y obtener todos los beneficios del compilador (por ejemplo, verificación de tipo).

  • no, no crea enlaces a esa enumeración, solo a typedefs.

    – xamiro

    28 de febrero de 2016 a las 0:18

  • No veo cómo el solicitante infirió que los comentarios afectarían el código; en cambio, querían saber cómo influir en la lógica de sugerencia de tipo de su IDE. Lo que parecen haber solicitado fue si era posible identificar enumeraciones en jsdoc y, de ser así, cuál era la sintaxis, con lo que su respuesta no parece ayudar. Sin embargo, admito que su pregunta podría haberse formulado mejor.

    – Jitsusama

    22 de enero de 2021 a las 14:50

  • no, no crea enlaces a esa enumeración, solo a typedefs.

    – xamiro

    28 de febrero de 2016 a las 0:18

  • No veo cómo el solicitante infirió que los comentarios afectarían el código; en cambio, querían saber cómo influir en la lógica de sugerencia de tipo de su IDE. Lo que parecen haber solicitado fue si era posible identificar enumeraciones en jsdoc y, de ser así, cuál era la sintaxis, con lo que su respuesta no parece ayudar. Sin embargo, admito que su pregunta podría haberse formulado mejor.

    – Jitsusama

    22 de enero de 2021 a las 14:50

¿Ha sido útil esta solución?