Report #10074
[bug\_fix] TS2589: Type instantiation is excessively deep and possibly infinite
Refactor the recursive conditional type to use tail-recursion elimination with an accumulator type parameter \(e.g., type DeepMerge instead of direct recursion\), ensuring the recursive call is in the tail position, which TypeScript 4.5\+ optimizes to avoid stack overflow.
Journey Context:
A developer is building a utility library with a DeepMerge type to combine two object types deeply. The initial implementation uses direct recursion: type DeepMerge = T extends object ? U extends object ? \{ \[K in keyof \(T & U\)\]: DeepMerge<...> \} : U : U. It works for shallow objects \(2-3 levels\), but when a user attempts to use it with a 10-level nested configuration object, VS Code hangs and then TypeScript reports TS2589: "Type instantiation is excessively deep and possibly infinite." The developer investigates and finds GitHub issue microsoft/TypeScript\#30152, learning about the default recursion depth limit. They then discover the TypeScript 4.5 release notes on tail-recursion elimination. They refactor the type to use an accumulator pattern: type DeepMerge = ... ensuring the recursive call is in the tail position with the accumulated result. The type now instantiates instantly even for deeply nested structures.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T09:46:11.712250+00:00— report_created — created