用途:解决 TypeScript 中“Type instantiation is excessively deep and possibly infinite”错误,并指导编写递归泛型类型。TypeScript 会限制类型实例化深度以防死循环,非尾递归类型会随递归层数不断堆叠嵌套结构,从而触发该限制。
主要能力:介绍用累加器(accumulator)模式把递归泛型改写为尾递归。核心做法是新增辅助类型,把已累积结果作为类型参数传入,并让递归调用处于尾位置,使 TypeScript 能够优化。资料给出元组构造、字符串替换、DeepReadonly 等示例:非尾递归写法如 [T, ...NTuple<T, Subtract<N,1>>] 或 ${Before}${To}${ReplaceAll<After,From,To>} 会逐层嵌套;尾递归写法改为 NTupleHelp<T, N, [T, ...Acc]> 或 ReplaceAllHelp<After, From, To, ${Acc}${Before}${To}>,由累加器迭代构建结果。DeepReadonly 示例还用 Seen 数组记录已访问类型以检测循环引用。
使用方式:遇到深度限制错误时,先定位引发问题的递归类型,添加带累加器参数的辅助类型,把递归调用移到尾位置,再用深层嵌套用例验证。资料强调没有可调高的 TypeScript 深度限制配置,该限制用于防止无限循环;生成类型(如来自 GraphQL)可能比预期更深,尾递归可提升健壮性。
适用场景:编写递归泛型、构建类型级循环或迭代、处理大型类型结构、深层嵌套对象转换。
限制:某些类型本身固有很深,即使尾递归也可能在嵌套 50 层以上时吃力;有时改用运行时校验更合适。资料未提供安装命令、平台或收费信息。