在 JSDoc 中记录开放式参数函数的正确方法

IT技术 javascript jsdoc
2021-03-18 03:15:40

假设您有以下内容:

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

在 JSDoc 中,你如何正确地证明这个函数可以接受任意数量的参数?这是我最好的猜测,但我不确定它是否正确。

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

相关:php - 如何记录可变数量的参数

4个回答

JSDoc规格谷歌的关闭编译器做这种方式:

@param {...number} var_args

其中“数字”是预期的参数类型。

然后,它的完整用法如下所示:

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

请注意有关使用arguments(或 的某些偏移量arguments)访问附加参数的注释var_args它只是用来向您的 IDE 发出信号,表明该参数确实存在。

ES6 中的 Rest 参数可以将真实参数更进一步以包含提供的值(因此不再需要使用arguments):

/**
* @param {...*} var_args
*/
function lookMaImES6Variadic(...var_args) {
    // Utilize the `var_args` array here, not `arguments`.
}
同样值得注意的是,WebStorm 的内部 JSDoc 文件(DHTML.js 等)使用相同的语法。也许这是事实上的标准。
2021-04-18 03:15:40
通过在 ES6 中添加rest 参数,这更有意义。/** @param {...Function} tasks The tasks. */ function waterfallTasks(...tasks) {其余参数始终在参数中具有功能性。
2021-04-28 03:15:40
应编辑此答案以整合 Adrian Holovaty 的答案:需要调用一个实际变量var_args或您想调用的任何变量作为唯一参数。可悲的黑客。
2021-04-29 03:15:40
这可能是我们所能得到的最接近答案:)
2021-05-03 03:15:40
这里也有很好的描述:usejsdoc.org/tags-param.html(“允许重复参数”部分)
2021-05-14 03:15:40

现在在 JSDoc 文档中描述如何做到这一点,它使用省略号,就像 Closure 文档所做的那样。

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

您需要在省略号后面提供一个类型,但您可以使用 a*来描述接受任何内容,或使用|分隔多个可接受的类型。在生成的文档中,JSDoc 将这个参数描述为可重复的,就像它将可选参数描述为optional 一样

在我的测试中,不需要在实际的 javascript 函数定义中使用参数,因此您的实际代码可以只有空括号,即function whatever() { ... }.

单一类型:

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

任何类型(在下面的示例中,方括号表示items将被标记为可选和可重复):

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

多个类型需要在类型列表周围加上括号,在左括号前加上省略号:

@param {...(Person|string)} attendees - Meeting attendees, listed as either 
                                        String names or {@link Person} objects
那么用作键值对的对象呢?。目前我使用:@param {{...(key: value)}} [config] - specific configs for this transfer但想知道这是否正确?
2021-04-23 03:15:40
@Max 我无法从文档中判断这是否是官方正确的做法,但看起来它应该按预期工作。因此,如果它生成您可以接受的输出,我会使用它:)
2021-05-05 03:15:40

来自JSDoc 用户组

没有任何官方方法,但一种可能的解决方案是:

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

方括号表示一个可选参数,而 ... 将(对我而言)表示“某个任意数字”。

另一种可能是这样...

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

无论哪种方式都应该传达您的意思。

虽然(2007 年)有点过时,但我不知道有什么更新的。

如果您需要将 param 类型记录为“混合”,请使用{*},如@param {*} [arguments]

@mistaecko 但只有命名参数正确吗?那是我没有使用的,所以这对我来说不是一个可以接受的答案......
2021-04-23 03:15:40
我不介意我的回答被否决,但我确实希望有评论解释你为什么这样做(无论你是谁)。如果您认为这是错误的,请告诉我 - 以及我们所有人 - 知道原因。
2021-04-25 03:15:40
我选择的 IDE(WebStorm 8.0.1)支持语法 #2 @param [arguments](或@param {*} [arguments]就此而言)以及 Google Closure 编译器建立的语法(在另一个答案中提到)。@param [...]不支持。
2021-04-25 03:15:40

我对此感到困惑了很长一段时间。以下是使用 Google Closure Compiler 执行此操作的方法:

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

关键是为您的函数提供一个var_args参数(或您在@param语句中调用的任何参数),即使该函数实际上并未使用该参数。