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

