Закрытие аннотации для функции с переменным числом аргументов

Я пишу код для компиляции 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

comment
Так оно и есть. Если вам не нравится это требование, вам, вероятно, следует поговорить с разработчиками Google Closure.   -  person Felix Kling    schedule 21.11.2014


Ответы (1)


"f5" - ожидаемый шаблон.

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

Альтернатива:

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