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
相关产品推荐
相关产品推荐

