Typescript[number,number]与number[]

Typescript[number,number]与number[],typescript,Typescript,有人能帮我理解为什么我得到了以下代码的类型错误: 函数sumOfTwoNumbersInArray(a:[数字,数字]){ 返回a[0]+a[1]; } sumOfTwoNumbersInArray([1,2]);//作品 设foo=[1,2]; sumOfTwoNumbersInArray(foo);//错误 错误是: “number[]”类型的参数不能分配给“[number,number]”类型的参数 类型“number[]”缺少类型“[number,number]”中的以下属性:0,1

有人能帮我理解为什么我得到了以下代码的类型错误:

函数sumOfTwoNumbersInArray(a:[数字,数字]){
返回a[0]+a[1];
}
sumOfTwoNumbersInArray([1,2]);//作品
设foo=[1,2];
sumOfTwoNumbersInArray(foo);//错误
错误是:

“number[]”类型的参数不能分配给“[number,number]”类型的参数

类型“number[]”缺少类型“[number,number]”中的以下属性:0,1


sumOfTwoNumbersInArray
中的参数
a
是一个元组。 它与
编号[]
不同

由于所有变量都是基本数组,所以下面的代码可以正常工作

function sumOfTwoNumbersInArray(a: number[]) { // parameter declared as array
  return a[0] + a[1];
}

let foo = [1, 2]; // initialization defaults to array

sumOfTwoNumbersInArray(foo); // no error.
正如Rafael提到的,将foo显式定义为元组也很好

function sumOfTwoNumbersInArray(a: [number, number]) { // parameter declared as a tuple
  return a[0] + a[1];
}

let foo: [number, number] = [1, 2]; // variable explicitely defined as a tuple

sumOfTwoNumbersInArray(foo); // no error.

在大多数情况下,当人们创建一个数组时,他们希望它具有动态大小,因此类型是
number[]

在较新的TS中,您应该能够执行此操作以获得恒定大小的键入:

let foo = [1, 2] as const;

但这可能会阻止更改阵列。因此,如果需要,您需要显式使用
[number,number]
作为类型注释。

参数类型是一个元组,而
foo
是一个数字数组。编译器会确保安全,并指定限制最少的类型。将一个传递给另一个会产生此错误。如果
foo
是一个元组,则应显式键入它:
let foo:[number,number]=[1,2]