Saltar al contenido

    ↑↓ mover · ⏎ abrir · esc cerrar

    TS2589

    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

    1. 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.

    2. 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.

    Adónde ir después

    Errores