【问题标题】:Correct way to document open-ended argument functions in JSDoc在 JSDoc 中记录开放式参数函数的正确方法
【发布时间】:2011-01-18 21:57:52
【问题描述】:

假设您有以下内容:

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 - How to doc a variable number of parameters

【问题讨论】:

    标签: javascript jsdoc


    【解决方案1】:

    JSDoc specsGoogle's Closure Compiler 这样做:

    @param {...number} var_args
    

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

    那么,它的完整用法如下所示:

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

    请注意关于使用arguments(或arguments 的一些偏移量)来访问您的其他参数的评论。 var_args 它只是用来向您的 IDE 发出该参数确实存在的信号。

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

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

    【讨论】:

    • 这可能是我们能得到的最接近答案了:)
    • 另外值得注意的是,WebStorm 的内部 JSDoc 文件(DHTML.js 等)使用相同的语法。也许这是事实上的标准。
    • 这里也有很好的描述:usejsdoc.org/tags-param.html(“允许重复参数”部分)
    • 应编辑此答案以整合 Adrian Holovaty 的答案:需要有一个名为 var_args 的实际变量或任何您想作为唯一参数调用的变量。可悲的黑客。
    • 在 ES6 中添加了rest parameters,这更有意义。 /** @param {...Function} tasks The tasks. */ function waterfallTasks(...tasks) { 其余参数始终在参数中具有功能性存在。
    【解决方案2】:

    如何做到这一点是 JSDoc 文档中的 now described,它使用省略号,就像 Closure 文档一样。

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

    您需要在省略号之后提供一个类型,但您可以使用* 来描述接受任何内容,或使用| 来分隔多个可接受的类型。在生成的文档中,JSDoc 将把这个参数描述为 repeatable,就像它把可选参数描述为 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 但想知道这是否正确?
    • @Max 我无法从文档中判断这是否是官方正确的做法,但看起来它应该可以按预期工作。因此,如果它生成您可以接受的输出,我会使用它:)
    【解决方案3】:

    来自JSDoc users group

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

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

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

    另一种可能是这个……

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

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

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

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

    【讨论】:

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

    我为此纠结了很长时间。以下是使用 Google Closure Compiler 的方法:

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

    关键是给你的函数一个var_args 参数(或者你在@param 语句中调用的任何参数),即使函数实际上并没有使用那个参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-13
      • 2017-02-06
      • 1970-01-01
      • 2014-08-04
      • 2022-01-16
      相关资源
      最近更新 更多