【问题标题】:A rest element type must be an array type for generic type in typescript剩余元素类型必须是 typescript 中泛型类型的数组类型
【发布时间】:2019-07-30 08:32:34
【问题描述】:

在下面的代码中

const f = <
  Args extends any[] = never
>(...args: Args) => {
  const foo: [number, number, ...Args] = [0, 0, ...args]
}

tsc 不喜欢 [number, number, ...Args],尽管我认为我将类型限制为带有 Args extends any[] 的数组

我收到这个错误

剩余元素类型必须是数组类型

【问题讨论】:

  • 我认为泛型类型参数不满足“必须是数组类型”的约束。在一般情况下,不要认为有解决这个问题的好方法。你能否提供一个更大的例子来说明你想用foo 做什么,需要将Args 传播到foo
  • @TitianCernicova-Dragomir 但它适用于函数参数类型上下文
  • @zerkms 不是 100% 确定你的意思。如果您指的是在调用站点获得数组类型的事实,那是正确的,但是当所有类型都已知而不仅仅是受约束的类型参数时,编译器通常可以做更多的事情
  • @TitianCernicova-Dragomir 我的意思是看起来不一致,(...args: Args) 可以用于其余的参数,但对于...Args 的其余数组解构则不行。
  • @AliHabibzadeh 我没有投反对票

标签: typescript


【解决方案1】:
type Args = any[];

const f = (...args: Args) => {
  const foo: [number, number, ...Args] = [0, 0, ...args]
}

【讨论】:

  • 嗯,改变了原代码的意思。对于Args = [string, string],您的版本将生成[number, number, [string, string]],原始版本将生成[number, number, string, string]
  • 不是我的反对票...除了 erouneoys 信息之外,我很少反对票。
  • 那看起来不像是个bug?
【解决方案2】:

如果您使用 Typescript 4.0 或更高版本,则此代码运行良好。您可以升级以使其编译。

【讨论】:

猜你喜欢
  • 2022-10-13
  • 1970-01-01
  • 2019-05-30
  • 2016-09-15
  • 1970-01-01
  • 2019-08-02
  • 2023-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多