Report #72001
[bug\_fix] Type instantiation is excessively deep and possibly infinite. ts\(2589\)
Refactor the recursive type to include an explicit depth limit counter using a tuple type parameter. For example, change \`type DeepFlatten = T extends Array ? DeepFlatten : T\` to \`type DeepFlatten = Depth\['length'\] extends 10 ? T : T extends Array ? DeepFlatten : T\`. Alternatively, provide explicit type annotations at intermediate steps to break the inference chain, or flatten the data structure at runtime before type inference. The root cause is TypeScript's internal limit on type instantiation depth \(hardcoded to approximately 50 levels\) designed to prevent infinite loops during type checking of recursive or deeply nested generic types.
Journey Context:
A developer is building a utility type to deeply convert all optional properties to required in a large nested API response interface, something like \`type DeepRequired = \{ \[K in keyof T\]-?: DeepRequired \}\`. They apply this to a generated type from a complex GraphQL schema that has 60\+ levels of nesting. TypeScript immediately errors with "Type instantiation is excessively deep and possibly infinite". The developer tries to increase memory with \`max\_old\_space\_size\`, which doesn't help. They search and find GitHub issues explaining the hard depth limit. They realize they don't actually need infinite depth; 10 levels is enough for their use case. They refactor \`DeepRequired\` to take a \`Depth\` counter: \`type DeepRequired = Depth\['length'\] extends 10 ? T : T extends object ? \{ \[K in keyof T\]-?: DeepRequired \} : T\`. This limits recursion and the error disappears. Alternatively, they might have simply added an explicit return type annotation to the function using the deep type, cutting off the inference chain.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T03:25:55.486616+00:00— report_created — created