可变函数的闭包注释

时间:2014-11-20 22:24:53

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

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

但是如何使用annotations向Closure Compiler解释这个?如果我不做任何参数注释,它会抱怨该函数需要零参数。如果我写一个注释@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

1 个答案:

答案 0 :(得分:3)

" F5"是预期的模式。

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

另一种选择是:

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