2011-01-18 10 views
57

Digamos que usted tiene algo como lo siguiente:manera correcta para documentar las funciones de argumentos indefinidos en jsdoc

var someFunc = function() { 
    // do something here with arguments 
} 

¿Cómo documentar correctamente que esta función puede tomar cualquier número de argumentos en jsdoc? Esta es mi mejor suposición, pero no estoy seguro de que sea correcta.

/** 
* @param {Mixed} [...] Unlimited amount of optional parameters 
*/ 
var someFunc = function() { 
    // do something here with arguments 
} 

Relacionado con: php - How to doc a variable number of parameters

Respuesta

69

El JSDoc specs y Google's Closure Compiler hacerlo de esta manera:

@param {...number} var_args 

donde "número" es el tipo de argumentos se esperaba.

El uso completo de esta, a continuación, se vería como la siguiente:

/** 
* @param {...*} var_args 
*/ 
function lookMaImVariadic(var_args) { 
    // Utilize the `arguments` object here, not `var_args`. 
} 

Nota el comentario acerca de la utilización de arguments (o algún desplazamiento de arguments) para acceder a sus argumentos adicionales. var_args solo se usa para indicar a su IDE que el argumento existe realmente.

Rest parameters in ES6 puede tomar el parámetro real de un paso más allá para abarcar los valores previstos (por lo que no es necesario un mayor uso de arguments):

/** 
* @param {...*} var_args 
*/ 
function lookMaImES6Variadic(...var_args) { 
    // Utilize the `var_args` array here, not `arguments`. 
} 
+0

Esto es p robably tan cerca de una respuesta como podamos :) – kflorence

+2

También vale la pena señalar, los archivos JSDoc internos de WebStorm (DHTML.js, etc.) usan esta misma sintaxis. Tal vez es el estándar de facto. –

+2

también se describe bastante bien aquí: http://usejsdoc.org/tags-param.html (sección 'Permitir que se repita un parámetro') – Francois

9

Desde el JSDoc users group:

No hay ninguna de manera oficial, pero una posible solución es esta:

/** 
* @param [...] Zero or more child nodes. If zero then ... otherwise .... 
*/ 

Los corchetes indican un parámetro opcional, y el ... sería (para mí) indicar "algún número arbitrario".

Otra posibilidad es esto ...

/** 
* @param [arguments] The child nodes. 
*/ 

cualquier manera debe comunicar lo que quiere decir.

Aunque está un poco anticuado (2007), no conozco nada más actual.

Si necesita documentar el tipo de param como 'mixto', use {*}, como en @param {*} [arguments].

+5

No me importa tener mi respuesta downvoted, pero sí espero un comentario que explique por qué lo hiciste (quienquiera que seas). Si crees que está mal, déjame a mí, y a todos nosotros, saber por qué. – hashchange

+1

Mi IDE de elección (WebStorm 8.0.1) admite la sintaxis # 2 '@param [argumentos]' (o '@param {*} [argumentos]' para el caso) así como la sintaxis establecida por el compilador de cierre de Google (mencionado en otra respuesta). '@param [...]' no es compatible. – mistaecko

+0

@mistaecko pero solo con los parámetros nombrados correctos? Eso es lo que no estoy usando, así que esta no es una respuesta aceptable para mí ... – Sebastian

10

Me quedé con esto por bastante tiempo. Así es como hacerlo con Google Closure Compiler:

/** 
* @param {...*} var_args 
*/ 
function my_function(var_args) { 
    // code that accesses the magic 'arguments' variable... 
} 

La clave es dar a su función de un parámetro var_args (o como se llame en su estado de cuenta @param) a pesar de que la función no utiliza realmente ese parámetro.

20

Cómo hacer esto es now described en la documentación de JSDoc, y utiliza puntos suspensivos como lo hacen los documentos de Cierre.

@param {...<type>} <argName> <Argument description> 

Debe suministrar un tipo de ir tras los puntos suspensivos, pero se puede utilizar un * para describir aceptar cualquier cosa, o utilizar el | para separar varios tipos aceptables. En la documentación generada, JSDoc describirá este argumento como repetible, del mismo modo que describe argumentos opcionales como opcional.

En mis pruebas no hubo necesidad de tener un argumento en la definición real de la función javascript, por lo que su código real puede tener paréntesis vacíos, es decir, function whatever() { ... }.

tipo individual:

@param {...number} terms Terms to multiply together 

Cualquier tipo (en el ejemplo siguiente, los corchetes significan items obtendrá etiquetado como ambos opcionales y repetible):

@param {...*} [items] - zero or more items to log. 

tipos múltiples necesitan paréntesis alrededor de la lista de tipos, con la elipsis antes de la apertura paren:

@param {...(Person|string)} attendees - Meeting attendees, listed as either 
             String names or {@link Person} objects 
+0

¿Y qué hay del objeto utilizado como pares clave-valor? Actualmente uso: '@param {{... (clave: valor)}} [config] - configuraciones específicas para esta transferencia' pero me preguntaba si esto es correcto. – Max

+0

@Max No puedo decir de los documentos si esa es la manera correcta oficial de hacerlo, pero parece que debería funcionar como se esperaba. Entonces, si genera resultados con los que está de acuerdo, lo usaría :) –

+0

@Max, será mejor que defina su propio tipo: http://usejsdoc.org/tags-typedef.html – m93a

Cuestiones relacionadas