2012-10-02 15 views
75

IMO,TypeScript語言的主要關注點之一是支持現有的vanilla JavaScript代碼。這是我第一眼看到的印象。看看下面的JavaScript函數是完全有效的:使用TypeScript的開放式函數參數

注意:我不是說我喜歡這種方法。我只是說這是一個有效的JavaScript代碼 。

function sum(numbers) { 

    var agregatedNumber = 0; 
    for(var i = 0; i < arguments.length; i++) { 
     agregatedNumber += arguments[i]; 
    } 

    return agregatedNumber; 
} 

所以,我們消耗與任意數量的參數此功能:

console.log(sum(1, 5, 10, 15, 20)); 

然而,當我嘗試了這一點與TypeScript Playground,它提供了編譯時錯誤。

我假設這是一個錯誤。假設我們沒有兼容性問題。那麼,有沒有辦法用開放式參數來編寫這種類型的函數呢?如C#中的params功能?

+0

使用lambda表達式只是好奇,爲什麼你甚至有一個命名'數字'參數?你沒有做任何事情。 –

+0

@JustinMorgan至少有一個參數讓Intellisense至少暗示應該有一些參數。 – drzaus

回答

183

這樣做的TypeScript方法是將省略號運算符(...)放在參數名稱的前面。上面會寫爲,

function sum(...numbers: number[]) { 
    var aggregateNumber = 0; 
    for (var i = 0; i < numbers.length; i++) 
     aggregateNumber += numbers[i]; 
    return aggregateNumber; 
} 

這將然後鍵入與

console.log(sum(1, 5, 10, 15, 20)); 
+0

太棒了!謝謝。這絕對是要走的路。所以,如果有人有我的問題中的現有代碼,它會中斷。對? – tugberk

+1

是的。它抱怨這個調用,但是你可以通過將簽名改爲sum(...)來聲明sum爲接受任何類型的多個參數,而不會改變錯誤。請隨意將此作爲CodePlex上的錯誤提交。 – chuckj

+1

正在尋找一個休息參數的例子。 TY。 –

2

除了正常檢查@chuckj回答:您還可以在打字稿

function sum(...nums: number[]): number { 
    return nums.reduce((a, b) => a + b, 0); 
}