繁体   English   中英

打字稿数组声明是否需要传播/休息运算符?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM