1

我在高級編譯模式下編寫了由Google Closure編譯器編譯的代碼。在我的代碼中的一些地方,我有通常用空參數列表寫入的可變參數函數。我會通過檢查體內的特殊變量arguments來訪問傳遞的參數。可變參數函數的關閉註釋

但是我怎樣才能解釋這個Closure編譯器使用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 
+3

這只是它是如何。如果你不喜歡這個要求,你應該與Google Closure開發者交談。 – 2014-11-20 22:37:20

回答

3

「F5」 是預期的圖案。

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

另一種方法是:

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