代码之家  ›  专栏  ›  技术社区  ›  vijrox

在TypeScript中,[1,2]为什么扩展[…unknown[],0。。。未知的

  •  1
  • vijrox  · 技术社区  · 2 年前

    我想知道 infer 在TypeScript中条件类型有效。我注意到的一件事 推断 TypeScript中的类型是,它们被定义为允许一个rest元素跟随另一个rest元件。例如

    type A<T> = T extends [...infer X, 0, ...infer Y] ? [X, Y] : never;
    type B = A<[1, 2]>; // B = [unknown[], unknown[]]
    

    有趣的是,TypeScript不仅说这个代码是有效的;条件也是 成功 ,给了我们 X = unknown[] 和 Y = unknown[] 然而,当我们在这些推断的类型中进行替换时,TypeScript会给我们一个错误:

    type C<T> = T extends [...unknown[], 0, ...unknown[]] ? true : false;
    // Error: A rest element cannot follow another rest element. (1265)
    

    为什么TypeScript要求您使用 推断 当使用多个rest元素时,为什么它说类型 [1, 2] 包含元素 0 ?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Blackhole    2 年前

    即使他们不会在 extends 子句,实际上并不支持多个rest类型。它是一个 known issue ,目前被认为是设计限制,不太可能固定(重点是我的):

    不幸的是 设计限制 因为我们有一个非常狭窄的启发式方法,它为推断元组中的多个rest类型提供了基本支持。目前还不清楚这是否是我们想要扩展的内容。虽然这是一个有用的最小重复,但问题描述中显示的示例 没有说明需要足够的动力来重新评估这一限制 。了解这个问题试图解决的具体需求将是有帮助的。