Report #16886
[bug\_fix] Type instantiation is excessively deep and possibly infinite. \(TS2589\)
Refactor the recursive type to use tail-recursion elimination \(TypeScript 4.5\+\), which requires rewriting the type to accumulate in a conditional type parameter rather than immediate recursion. Alternatively, replace the custom utility with optimized library implementations \(e.g., \`type-fest\`'s \`PartialDeep\` which handles recursion safely\), or explicitly cap recursion using a depth counter type parameter.
Journey Context:
You create a utility type \`type DeepPartial = \{ \[P in keyof T\]?: DeepPartial \}\` to make all properties optional recursively. You apply it to a massive Prisma Client type or a recursive JSON schema with self-referencing objects \(e.g., a TreeNode containing TreeNode children\). TypeScript hangs for seconds then throws TS2589. You check your type definition; it looks correct. You search the error and find it's a hardcoded instantiation depth limit \(50\) to prevent infinite loops. You find GitHub issues discussing tail-recursion elimination added in TypeScript 4.5. You try to refactor \`DeepPartial\` into a tail-recursive form using an accumulator type, but struggle. You discover \`type-fest\` has a battle-tested \`PartialDeep\`. You replace your custom type with \`type-fest\`'s version, and the error vanishes while maintaining functionality. You realize the importance of optimizing recursive types for the compiler's limits.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T03:53:43.637120+00:00— report_created — created