Я пишу код для компиляции Google Closure Compiler в расширенном режиме компиляции. В некоторых местах моего кода у меня есть вариативные функции, которые я обычно пишу с пустым списком аргументов. Я бы получил доступ к переданным аргументам, проверив специальную переменную arguments
внутри тела.
Но как мне объяснить это компилятору Closure с помощью аннотаций? Если я не делаю никаких аннотаций параметров, он жалуется, что функция ожидает нулевых аргументов. Если я пишу аннотацию @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