【发布时间】: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