Przejdź do treści
webtype.orgwebtype.orgTS1110

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    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

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

      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.

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

    Dokąd dalej

    Błędy