[英]Is the spread / rest operator necessary for typescript array declarations?
通读一些看起来像这样的代码:
export function printAdd(...numbers: number[]) {
alert(`Adding the numbers: ${numbers.join(', ')}`);
}
是...
in ...numbers
必要的。 IIUC 这意味着 numbers 是一个数组,但我们也用number[]
声明它,所以看起来我们是双重浸渍?
... in ...数字是必要的吗?
不,但这个问题的答案完全取决于您对参数的预期用途。
在您引用的示例中, ...
表示休息参数。 使用 this 会将调用函数时指定的所有参数分组到指定类型的数组中(在这种情况下,类型为number
)。 考虑以下示例函数和调用:
export function printAdd(...numbers: number[]) {
alert(`Adding the numbers: ${numbers.join(', ')}`);
}
printAdd(1, 2, 3); // Valid because there are 0 or more arguments of type number
printAdd([1, 2, 3]); // Not valid because there is a single argument and it is of type number[]
不使用 rest 参数向编译器表明该函数期望接收类型为number[]
的单个参数。
export function printAdd(numbers: number[]) {
alert(`Adding the numbers: ${numbers.join(', ')}`);
}
printAdd(1, 2, 3); // Not valid because there are 3 arguments of type number
printAdd([1, 2, 3]); // Valid because there is a single argument of type number[]
通过分析 Typescript 编译器的输出,这一点变得更加明显。 编译后,第一个示例变为:
// COMPILER OUTPUT
function printAdd() {
var numbers = [];
for (var _i = 0; _i < arguments.length; _i++) {
numbers[_i] = arguments[_i];
}
alert("Adding the numbers: " + numbers.join(', '));
}
注意arguments
对象的使用。 这是一个类似数组的对象,但它不是数组。 这意味着您不能在其上使用任何Array.prototype
方法。
第二个例子变成
// COMPILER OUTPUT
function printAdd(numbers) {
alert("Adding the numbers: " + numbers.join(', '));
}
不使用arguments
对象,并且numbers
是一个Array
,因此Array.prototype
方法可以立即使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.