使用 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 的开放式函数参数的主要内容,如果未能解决你的问题,请参考以下文章