2012-10-16 81 views
16

headjs對其API執行一些非常瘋狂的JavaScript類型的事情。例如,它爲一個函數獲取任意數量的字符串(不是字符串數組)。例如,有時會結束相同的函數調用,您可以選擇使用函數結束它。具有可變數量/參數類型的函數的TypeScript聲明文件

head.js("scripturl1", "scripturl2",...,callback); 

你也可以(很容易),請執行下列操作

head.js({scriptlabel:"scripturl1"},{scriptlabel2:"scripturl2"},...., callback); 

我的問題是如何赫克我們描述了在一個聲明文件?因爲我目前的傳球似乎完全錯誤,所以我都在這裏。

+0

我已經發布了[打字稿功能要求(https://github.com/Microsoft/TypeScript/issues/15190),因爲它是我在別處看到的(中等有用的)模式。 – AJP

回答

30

TS語言規範將可變數量/傳播參數稱爲「剩餘參數」。具有接受其餘參數的函數簽名的示例界面:

interface IExample { 
    fn : (...args : any[]) => any; 
} 

var x : IExample = { 
    fn: function(...args : any[]) { 
     for (var i = 0, arg; arg = args[i]; i++) { 
      console.log(arg); 
     } 
    } 
} 

x.fn(1); 
x.fn(1, 2); 
x.fn("cat", "dog", "mouse"); 

不幸的是,存在一些限制。 「Rest Parameters」必須是函數簽名中的最後一個 - 因此您將無法捕獲回調參數的類型,因爲它在重複參數之後。

如果不是,你就已經能夠做這樣的事:

var fn = function(cb: Function, ...args : string[]) { 
    ... 
} 
+0

雅與它一段時間後,我來到了同樣的結論,你做..希望我可以已經做了...字符串:字符串[],回調:()=>無效但唉,沒有運氣:-(..)感謝您的帖子。 –

+0

實際上有一個更清潔的更好的解決方案,這在技術上不是這個實際問題的答案(所以如果你必須這樣做,那麼就應該是downvote),但更多的建議是:只要把你的參數放在一個對象中。喜歡這個.... myFunc(「param1」,「param2」,{「varParam1」:4「varParam2」:3}); 這實際上是更具可讀性的代碼,如果你想爲參數對象聲明一個接口,它可以用上面的代碼乾淨地工作。所以,就是說,javascript在處理REST對象的方式上已經非常好用,甚至不需要語言中的可變參數函數,也不需要TypeScrip – 2017-01-28 05:13:23

+0

@ClayFerguson ...當您有1時使用rest模式到n個值(可能甚至是0到n的值?)以及其他參數(如回調)傳遞給該函數。例如:[drop(arg1,arg2,...,argn,callback))](https://github.com/hapijs/hapi/blob/master/API.md#servermethodname-method-options) – AJP

-3

聲明很簡單:

function foo() { //... 

在JavaScript函數的定義函數的參數部分只是諮詢。當調用一個函數時,Javascript允許調用少於聲明的參數數量(參數未傳遞給undefined)或者超過聲明的參數數量。

當函數被調用時,創建一個arguments object。參數對象有點像數組(儘管它不是一個適當的數組對象),它保存了每個參數中傳遞的數組。

因此,舉例來說,處理無限的參數,你可以簡單地做:

function foo() { 
    for (var n=0; n<arguments.length; n++) { 
    alert(arguments[n]); 
    } 
} 

所以,現在你可以調用foo,如:

foo(1,2,3); 
foo(1,2,3,4,5,6,7,8); 

除此之外,它只是使用的問題typeof,itstanceof等來檢測傳入什麼類型的參數並相應地處理它們。

+0

我瞭解這背後的JavaScript,但實際的問題是特定的TypeScript的......但謝謝你的職位:-) –

相關問題