Instanciación excesivamente profunda
Type instantiation is excessively deep and possibly infinite.Las palabras del propio compilador. Sin traducir — es la cadena que pegaste en el buscador.
Un tipo recursivo fue más lejos de lo que el compilador está dispuesto a seguir — normalmente unos cincuenta niveles, y casi siempre porque la recursión cuenta en vez de encogerse.
Reproducción
type Repeat<S extends string, N extends number, A extends unknown[] = []> = A['length'] extends N ? S : Repeat<`${S}x`, N, [...A, unknown]> type Long = Repeat<'a', 1000>
La compilación afirma que esto emite exactamente este código.
Por qué lo dice el compilador
TypeScript pone un techo duro a cuántas veces un tipo puede instanciarse a sí mismo, porque un tipo que recursa para siempre colgaría el compilador en vez de fallar. El límite no es un error y no es ajustable. Alcanzarlo significa que la recursión está haciendo aritmética — un paso por unidad — y el único arreglo que escala es hacer que cada paso quite más trabajo del que añade.
Arreglos
- 01
type Repeat<S extends string, N extends number, A extends unknown[] = []> = A['length'] extends N ? S : Repeat<`${S}x`, N, [...A, unknown]> type Short = Repeat<'a', 12>
Quédate bajo el techo. Si la entrada es realmente pequeña — una ruta de cuatro segmentos, una tupla de diez miembros — la recursión que cuenta está bien, y el arreglo honesto es dejar de pedirle mil.
- 02
type Repeat<S extends string, N extends number> = N extends 0 ? '' : string type Wide = Repeat<'a', 1000>
O renuncia a la precisión. Un tipo que devuelve `string` para cualquier cosa grande es menos informativo e infinitamente más barato, y para un valor que nadie lee carácter a carácter suele ser el trato correcto.
Conclusión
Este error casi nunca se resuelve reestructurando la recursión. Se resuelve queriendo menos: una entrada más pequeña, o una respuesta más vaga.