【问题标题】:Closure annotation for variadic function可变参数函数的闭包注释
【发布时间】:2015-01-18 23:23:26
【问题描述】:

我正在编写由 Google Closure Compiler 在高级编译模式下编译的代码。在我的代码中的某些地方,我通常使用空参数列表编写可变参数函数。我将通过检查主体内的特殊变量 arguments 来访问传递的参数。

但是我如何使用annotations 向闭包编译器解释这一点?如果我不做任何参数注释,它会抱怨该函数需要零参数。如果我写了一个注解@param {...*}(表示任意数量的任意类型的参数),那么它就会报错,因为@param 注解必须包含参数的名称。如果我写@param {...*} arguments,那么它会抱怨命名参数不会出现在函数实现的参数列表中。

我发现让 Google 满意的唯一方法是在参数列表中也包含一个虚拟名称,即使它从未使用过。反过来,这可能会使读者感到困惑,也许还有一些短绒。所以我更喜欢一些替代品,如果有的话。

/** WARNING - Function f1: called with 3 argument(s).
 *            Function requires at least 0 argument(s) and no more than 0 argument(s).
 * @return {number} */
function f1() { return arguments.length; }

/** WARNING - Bad type annotation. expecting a variable name in a @param tag
 * @param {...*}
 * @return {number} */
function f2() { return arguments.length; }

/** WARNING - parameter arguments does not appear in f3's parameter list
 * @param {...*} arguments
 * @return {number} */
function f3() { return arguments.length; }

/** WARNING - Function f4: called with 3 argument(s).
 *            Function requires at least 0 argument(s) and no more than 0 argument(s).
 * @return {number} */
function f4(/* ... */) { return arguments.length; }

/** This works but seems slightly confusing to me.
 * @param {...*} var_args
 * @return {number} */
function f5(var_args) { return arguments.length; }

window["run"] = function() {
  return f1(1,2,3) + f2(1,2,3) + f3(1,2,3) + f4(1,2,3) + f5(1,2,3);
};

编译使用

java -jar compiler.jar --compilation_level ADVANCED --warning_level VERBOSE foo.js

【问题讨论】:

  • 就是这样。如果您不喜欢这个要求,您可能应该与 Google Closure 开发人员联系。

标签: javascript annotations google-closure-compiler jsdoc variadic-functions


【解决方案1】:

“f5”是预期的模式。

/** 
 * @param {...*} var_args
 * @return {number} 
 */
function f5(var_args) { return arguments.length; }

另一种选择是:

/** @type {function(...*):number} */
function f5() { return arguments.length; }

【讨论】:

    猜你喜欢
    • 2023-01-14
    • 2017-06-10
    • 2011-07-29
    • 2018-03-12
    • 2023-03-09
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多