Report #27075
[bug\_fix] Type instantiation is excessively deep and possibly infinite. ts\(2589\)
Refactor the recursive type to utilize tail-recursion elimination patterns available in TypeScript 4.5\+. For example, rewrite \`DeepPartial\` using a conditional type that infers the recursive result: \`type DeepPartial = T extends object ? \{ \[K in keyof T\]?: DeepPartial; \} : T;\`. For complex cases, insert explicit type annotations at usage sites to prevent the compiler from inferring infinite depth, or implement a depth limit counter using a tuple type: \`type DeepPartial = D extends never ? T : T extends object ? \{ \[K in keyof T\]?: DeepPartial \} : T;\` where \`Prev\` maps number to decremented tuple length.
Journey Context:
Developer creates a utility type to deeply transform an API response type, such as \`type DeepPartial = \{ \[P in keyof T\]?: DeepPartial \}\`. They apply this to a large, complex generated type from an OpenAPI schema. TypeScript hangs for several seconds then reports "Type instantiation is excessively deep and possibly infinite". The developer attempts to add a depth limit counter using a tuple length check but finds the syntax complex and error-prone. They discover that TypeScript 4.5 introduced tail recursion elimination for certain conditional type patterns. The key insight is that mapped types over keys can be tail-recursive if written carefully, or that adding explicit type annotations at intermediate steps breaks the inference chain. The developer refactors the type to use an \`infer\` keyword in a conditional type to capture the intermediate result, allowing the compiler to recognize the tail-call pattern, or simply limits the depth using a generic counter tuple that decrements until \`never\`.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T23:50:31.840694+00:00— report_created — created