使用 TypeScript 的开放式函数参数

Posted

技术标签:

【中文标题】使用 TypeScript 的开放式函数参数【英文标题】:open-ended function arguments with TypeScript 【发布时间】:2012-09-23 17:15:10 【问题描述】:

IMO,TypeScript 语言的主要关注点之一是支持现有的 vanilla 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 尝试此操作时,它会出现编译时错误。

我假设这是一个错误。假设我们没有兼容性问题。那么,有没有办法用开放式参数编写这种类型的函数呢?比如C#中的params功能?

【问题讨论】:

只是好奇,为什么你还有一个名为numbers 的参数?你没有用它做任何事情。 @JustinMorgan 至少有一个参数让 Intellisense 至少暗示应该有一些参数。 【参考方案1】:

除了@chuckj 答案:您还可以在 TypeScript 中使用 arrow function expression(在 Java / .NET 中类似于 lambda

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

【讨论】:

【参考方案2】:

在Typescript中是Rest Parameter的概念,它是接收多个相似类型值的参数。如果我们以typescript为目标,那么我们必须编写代码ECMAScript 6 标准,然后 typescript transpiler 将其转换为等效的 java 脚本代码(这是 ECMAScript 5 标准)。如果我们使用 typescript 那么我们必须使用三个点(...)preferx restparameter 变量名,比如函数 sum(...numbers: number[]),那么就可以了。

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

【讨论】:

【参考方案3】:

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));

【讨论】:

太棒了!谢谢。这绝对是要走的路。所以,如果有人有我的问题中的现有代码,它将中断。对吗? 是的。它抱怨调用,但您可以通过将签名更改为 sum(...) 来声明 sum 接受任何类型的多个参数,而不是它会消除错误。请随时将此作为 CodePlex 上的错误提交。 正在寻找一个休息参数示例。泰。

以上是关于使用 TypeScript 的开放式函数参数的主要内容,如果未能解决你的问题,请参考以下文章

盘点 TypeScript 的基础认识 二

盘点 TypeScript 的基础认识 二

盘点 TypeScript 的基础认识 二

LayaBox---TypeScript---JavaScript文件类型检查

TypeScript系列教程11函数的使用

typescript 装饰器