You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript条件类型:扩展运算符引发无限实例化问题咨询

TypeScript泛型条件类型无限实例化问题解析

核心问题

  • 为何Foo1报错「Type instantiation is excessively deep and possibly infinite.」,而Bar1/2/3可正常运行?这是TypeScript的设计行为吗?
  • 为何Foo2能够正常运行?

我查阅了TypeScript条件类型的所有文档及发布说明,均未找到答案😥

代码示例

type Foo1<T> = T   extends ''   ? [...Foo1<T>]   : never
// ERROR!
// Type instantiation is excessively deep and possibly infinite.

// 为什么这行没有同样的问题?
type Foo2<T> = [T] extends [''] ? [...Foo2<T>]   : never

// 其他可正常运行的案例,看起来扩展运算符会触发提前解析?
type Bar1<T> = T   extends ''   ? Bar1<T>        : never
type Bar2<T> = T   extends ''   ? [Bar2<T>]      : never
type Bar3<T> = T   extends ''   ? { a: Bar3<T> } : never

更多细节

上述示例是简化版,调用这些泛型类型会引发无限深度实例化。如果需要更贴合实际的场景,可以尝试解决Type-Challenge的3376题(中序遍历)。

部分解决方案采用了[T] extends [TreeNode] ? ... : ...的技巧,比如某份提交实现。

我知道这种写法可以避免条件类型的分发特性,但Bar1/2/3同样使用了分发式条件类型,为何没有出现问题?

对比Foo1和Bar2,似乎只有扩展运算符...是特殊情况,会触发提前解析,这看起来不太一致。有没有相关的行为文档?

我正在查阅TypeScript源码试图寻找答案,老实说理解起来有点难度😂,如果找到结果会在此分享。


内容的提问来源于stack exchange,提问作者Alan Zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:20:45