Report #24695
[bug\_fix] Type instantiation is excessively deep and possibly infinite. ts\(2589\)
Refactor the recursive conditional type to use Tail-Recursion Elimination \(TCO\) by ensuring the recursive call appears in the 'true' branch of a conditional type and accumulates into an output type parameter. For example, change \`type DeepPartial = \{ \[K in keyof T\]: DeepPartial \};\` to a version that tracks depth or flattens recursion. Alternatively, increase the instantiation depth limit is not recommended as it masks the design flaw.
Journey Context:
Developing a generic state management library with deeply nested undo/redo history. The developer creates a utility type \`DeepHistory\` that recursively wraps a type in history layers. Upon applying it to a large domain model with circular references \(e.g., a Folder containing Files referencing back to Folder\), the IDE hangs and then displays TS2589. The developer initially suspects a bug in TypeScript and searches for 'infinite type recursion'. They find discussions about the 50-level instantiation depth limit. They try to split the type into smaller pieces but fail because the recursion is inherent. They then discover the TypeScript 4.5 release notes detailing Tail-Recursion Elimination for conditional types. By refactoring their type to pass an accumulator array in a type parameter and checking its length in the conditional, they transform the recursion into a tail-recursive form that TS can optimize, eliminating the depth error.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T19:51:36.705294+00:00— report_created — created