TS1110
Warunek bez gałęzi else
Type expected.Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.
Typ warunkowy musi powiedzieć, co się dzieje, gdy sprawdzenie zawiedzie. Na poziomie typów nie ma opcjonalnego else, bo każdy typ musi się do czegoś sprowadzić.
Odtworzenie
type Digit = '0' | '1' | '2' type IsDigit<T extends string> = T extends Digit ? true :
Build potwierdza, że to emituje dokładnie ten kod.
Dlaczego kompilator tak mówi
`if` może nic nie zrobić, gdy warunek jest fałszywy; typ warunkowy nie może, bo całe wyrażenie i tak musi nazwać jakiś typ. `T extends U ? X : Y` to jedyny istniejący kształt — `:` nie jest opcjonalną interpunkcją, lecz gałęzią odpowiadającą „a w przeciwnym razie”. Tak jak TS1109 pochodzi to od parsera, więc jest zgłaszane, zanim rozwiązany zostanie choć jeden typ, a komunikat nazywa to, czego chciała gramatyka, a nie to, co budowałeś.
Naprawy
- 01
type Digit = '0' | '1' | '2' type IsDigit<T extends string> = T extends Digit ? true : false type Yes = IsDigit<'1'> type No = IsDigit<'x'>
Odpowiedz na pytanie. Predykat chce `false` w drugiej gałęzi i wtedy jest wartością logiczną dla każdego wejścia, a nie dla niektórych.
- 02
type Digit = '0' | '1' | '2' type OnlyDigits<T extends string> = T extends Digit ? T : never type Kept = OnlyDigits<'1' | 'x' | '2'>
Albo użyj `never` jako else — tak filtruje się unię: składowe, które nie przejdą sprawdzenia, nic nie wnoszą i znikają z wyniku.
Wniosek
`never` to gałąź else, której chcesz częściej, niż się spodziewasz. To nie wartość błędu — to brak, dzięki któremu dystrybutywny warunek działa jak filtr.

