How array destructuring "tuple types" work with arrays?

时间:2018-04-25 14:43:59

标签: arrays typescript ecmascript-6 tuples destructuring

In the below code,

function f([first, second]: [number, number]){
    console.log(first);
    console.log(second);
}

var input:number[] = [1,2];
f(input);

number[] type variable(input) is passed to f.

why compiler considers literal [1,2] as tuple type but not array type in f([1,2])?

2 个答案:

答案 0 :(得分:3)

TypeScript可以非常具体地传递给方法。

对于你的例子:

function f([first, second]: [number, number]){
    console.log(first);
    console.log(second);
}

这将有效:

var x: [number, number] = [1,2];

f([1,2]); // Type is implied:  [number, number]
f(x);     // Type is explicit: [number, number]

这不会:

var x = [1,2,3];
var y = [1,2];
var z: number[] = [1,2];

f(x); // Type is implied:  number[]
f(y); // Type is implied:  number[]
f(z); // Type is explicit: number[]

你告诉打字稿期待一个包含2个数字的数组。这就是为什么它不接受任何而是包含2个数字的数组。

您可以更改接受的类型:

function f([first, second]: number[]){
// Keep destructuring ^,      ^ but change the accepted type.
    console.log(first);  
    console.log(second);
}

然后,前面的6个示例中的任何一个都可以使用,因为[number, <number...>]也是number[]数组。

答案 1 :(得分:0)

它不是关于数组而是简单的类型检查。 它会给您一个错误,因为number[]类型与[number, number]不一样。

您可以将input类型更改为[number, number],如下所示

var input: [number, number] = [1, 2]

或按原样保留输入并执行以下操作

f(input as [number, number])

修改

f([1,2])工作得很好,因为你明确地传递了两个数字。