我正在以高级编译模式编写由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
答案 0 :(得分:3)
" F5"是预期的模式。
/**
* @param {...*} var_args
* @return {number}
*/
function f5(var_args) { return arguments.length; }
另一种选择是:
/** @type {function(...*):number} */
function f5() { return arguments.length; }