带TypeScript的开放式函数参数


127

IMO,TypeScript语言的主要关注点之一是支持现有的原始JavaScript代码。这是我乍看之下的印象。看下面的JavaScript函数,它是完全有效的:

注意:我并不是说我喜欢这种方法。我只是说这是有效的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进行尝试时,会出现编译时错误。

我假设这是一个错误。假设我们没有兼容性问题。那么,有什么方法可以使用开放式参数编写此类函数?如paramsC#中的功能?


2
很好奇,为什么还要命名numbers参数呢?您什么都不用做。
贾斯汀·摩根

1
具有至少一个参数的@JustinMorgan让Intellisense至少暗示应该有一些参数。
drzaus

Answers:


267

TypeScript的实现方法是将省略号运算符(...)放在参数名称之前。以上将写为

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

然后,将正确键入check with

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

大!谢谢。这绝对是要走的路。因此,如果有人在我的问题中已有代码,则它将中断。对?
tugberk

1
是。它抱怨调用,但是您可以通过将签名更改为sum(...)来将sum声明为接受任何类型的多个参数,否则它将使错误静音。请随时将其作为CodePlex上的错误提交。
chuckj 2012年

1
正在寻找一个休息参数的例子。泰
2012年

5

除了@chuckj答案:您还可以arrow function expression在TypeScript中使用(lambda在Java / .NET中是一种)

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

4

在Typescript中,这是Rest Parameter的概念,它是接收相似类型的多个值的参数。如果我们以TypeScript为目标,则必须编写ECMAScript 6标准代码,然后Typescript编译器将其转换为等效的Java脚本代码(这是ECMAScript 5标准)。如果使用打字稿,则必须使用带有restparameter变量名称的三个点(...)preferredx,例如函数sum(... numbers:number []),然后它才能工作。

注意: Rest参数必须是参数列表中的最后一个参数。同样,函数sum(name:string,age:number,... numbers:number [])。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.