Saltar al contenido
webtype.orgwebtype.orgTS1110

    ↑↓ mover · ⏎ abrir · esc cerrar

    TS1110

    Un condicional sin else

    Type expected.

    Las palabras del propio compilador. Sin traducir — es la cadena que pegaste en el buscador.

    Un tipo condicional debe decir qué pasa cuando la comprobación falla. En el nivel de tipos no hay else opcional, porque todo tipo tiene que resolverse a algo.

    Reproducción

    type Digit = '0' | '1' | '2'
    
    type IsDigit<T extends string> = T extends Digit ? true :

    La compilación afirma que esto emite exactamente este código.

    Por qué lo dice el compilador

    Un `if` puede no hacer nada cuando su condición es falsa; un tipo condicional no puede, porque la expresión entera tiene que nombrar un tipo de todos modos. `T extends U ? X : Y` es la única forma que existe — los `:` no son puntuación opcional, sino la rama que responde «y si no». Como TS1109, esto viene del analizador, así que se informa antes de resolver un solo tipo, y el mensaje nombra lo que quería la gramática, no lo que estabas construyendo.

    Arreglos

    1. 01
      type Digit = '0' | '1' | '2'
      
      type IsDigit<T extends string> = T extends Digit ? true : false
      
      type Yes = IsDigit<'1'>
      type No = IsDigit<'x'>

      Responde a la pregunta. Un predicado quiere `false` en la otra rama, y entonces es un booleano para toda entrada y no solo para algunas.

    2. 02
      type Digit = '0' | '1' | '2'
      
      type OnlyDigits<T extends string> = T extends Digit ? T : never
      
      type Kept = OnlyDigits<'1' | 'x' | '2'>

      O usa `never` como else, que es como se filtra una unión: los miembros que no pasan la comprobación no aportan nada y desaparecen del resultado.

    Conclusión

    `never` es la rama else que quieres más a menudo de lo que esperas. No es un valor de error — es la ausencia que hace que un condicional distributivo funcione como un filtro.

    Adónde ir después

    Errores