[number, number] 是元组类型吗?

Is [number, number] a tuple type?

在下面的代码中,

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

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

number[] 类型变量 (input) 传递给 f.

为什么会出现编译错误? Argument of type 'number[]' is not assignable to parameter of type '[number, number]'. Type 'number[]' is missing the following properties from type '[number, number]': 0, 1ts(2345)

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

你告诉 typescript 期望 一个包含 2 个数字的数组。这就是为什么它不接受 任何东西 而是一个包含 2 个数字的数组。

您可以像这样更改接受的类型:

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

那么,前面 6 个示例中的任何一个都可以工作,因为 [number, <number...>] 也是 number[] 数组。

这与数组无关,而是简单的类型检查。 它给你一个错误,因为类型 number[][number, number].

不同

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

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

或保持输入不变并执行以下操作

f(input as [number, number])

编辑

f([1,2]) 工作正常,因为您明确传递了两个数字。