【问题标题】:Typescript [number, number] vs number[]打字稿[数字,数字]与数字[]
【发布时间】:2019-09-30 04:50:52
【问题描述】:

谁能帮我理解为什么我会收到以下代码的类型错误:

function sumOfTwoNumbersInArray(a: [number, number]) {
    return a[0] + a[1];
}

sumOfTwoNumbersInArray([1, 2]); // Works

let foo = [1, 2];
sumOfTwoNumbersInArray(foo); // Error

错误是:

'number[]' 类型的参数不能分配给'[number, number]' 类型的参数。

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

【问题讨论】:

  • 参数类型是一个元组,而foo是一个数字数组。编译器会确保安全并分配限制最少的类型。将一个传递给另一个会产生此错误。如果foo 是一个元组,你应该明确输入:let foo: [number, number] = [1,2];

标签: typescript


【解决方案1】:

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

以下工作正常,因为所有变量都是基本数组

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.

【讨论】:

    【解决方案2】:

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

    在较新的 TS 中,您应该能够这样做以获得恒定大小的输入:

    let foo = [1, 2] as const;
    

    不过,这可能会阻止更改数组。因此,如果您需要明确使用 [number, number] 作为类型注释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2015-12-22
      • 2022-01-09
      • 2019-11-13
      • 2023-04-05
      相关资源
      最近更新 更多