2013-12-19 40 views
1

什麼是正確的方式來註釋我可以通過一個對象作爲函數參數傳遞的選項類型?例如:Closure-param類型的對象。 <string, *>不能正常工作

/** 
* test() function can receive all type of options. 
* @param {Object.<string, *>} options 
* @expose 
*/ 
function test(options) { 
    if(typeof options.set !== "undefined") { 
     alert(options.set); 
    } 

    if(typeof options.callback !== "undefined") { 
     options.callback.apply(this, []); 
    } 
} 

我如何定義類似的東西......?

/** 
* @param {Object.<string, *>} options 
*  @param {Object.<string, *>} options.set 
*  @param {function(... [*])} options.callback 
*/ 

如果我不能什麼都不做,編譯器返回如下錯誤:

script.js:28: WARNING - Property callback never defined on Object.<string, *> 
        options.callback.apply(this, []); 
       ^

使用方法:

java -jar "compiler.jar" 
    --compilation_level ADVANCED_OPTIMIZATIONS 
    --warning_level VERBOSE 
    --js "script.js" 
    --js_output_file "script.min.js" 
+0

您是否嘗試過最簡單的選項:'@param {*} options'? – Tony

+1

我喜歡指定每個選項的確切內容。我正在考慮使用'@界面'。 –

+0

正確的選項是將其完全定義爲「接口」或其他類型,或使用記錄類型註釋。這取決於選項的來源以及創建方式。 –

回答

-1

只需要創建一個新的變量,並將其設置爲@constructor@expose所有這些方法,如:

/** 
* @constructor 
*/ 
var TestOptions = function() { 
    /** 
    * @type {Object.<string, *>} 
    * @expose 
    */ 
    this.set; 

    /** 
    * @type {function(... [*])} 
    * @expose 
    */ 
    this.callback; 
}; 

我只需要設置此爲@param類型,如後:

/** 
* test() function can receive all type of options. 
* @param {TestOptions} options 
* @expose 
*/ 
function test(options) { 
    /* ... */ 
} 

TestOptions不會對script.min.js,因爲我從來沒有在它使用new

+0

哎喲不要使用'@ expose'那樣的。您無效化所有重命名和死代碼消除。 –

+0

在我的情況是必不可少的,因爲我建立了一個圖書館。所以我需要導出這個名字,一旦這個用戶將它放在文檔上。 –

+1

'@ expose'現已被棄用。作者應該適當地將他們的代碼遷移到使用'@ export'或'@ nocollapse'。 –

3

您可以使用record type

@param {{set: Object, callback: function}} options 
+0

正確 - 只是不要忘記,記錄類型選項仍將進行重命名。 –

+0

也可選參數通過在參數類型中包含「undefined」來聲明。 – John

2

如果要確切指定每一個選項,你可以做這樣的:

/** 
* @param {{row: number, field: string, callback: function(string) }} options 
*/ 

所以,你可以聲明對象結構,包括類型,細節是here

相關問題