【问题标题】:Is [number, number] a tuple type?[number, number] 是元组类型吗?
【发布时间】:2023-03-19 07:09:01
【问题描述】:

在下面的代码中,

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)

【问题讨论】:

  • 除了[number, number][1, 2] 还能是什么?
  • @Cerbrus 不能是number[]吗?我们在 C、Java 中做到了这一点......
  • @Cerbrus A number[] 数组显然
  • 问题是“为什么要编译/类型检查?”,而不是“这是如何工作的?”,对吧?
  • [number, number](由两个数字成员组成的数组)比 number[](由 x 个数字成员组成的数组)更具体,这就是 TypeScript 会抛出的原因编译错误。如果您反转类型声明并使用var input: [number, number]f([first, second]: number[]),它将起作用。

标签: arrays typescript ecmascript-6 tuples destructuring


【解决方案1】:

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[] 数组。

【讨论】:

  • 您的答案对我来说似乎不正确。对于let inp = [1, 2];,编译器的类型推断将inp 称为number[]
  • @overexchange:你只是完全打破了我的回答。你对 TypeScript 的工作原理做出了很多不正确的假设
  • f(x) 将不起作用,其中var x = [1,2] 因为x 被推断为number[] 类型
  • 我错过了那个。
【解决方案2】:

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

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

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

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

f(input as [number, number])

编辑

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

【讨论】:

  • 更新了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2021-09-18
  • 1970-01-01
相关资源
最近更新 更多