Przejdź do treści

    ↑↓ ruch · ⏎ otwórz · esc zamknij

    TS2367

    Porównanie bez części wspólnej

    This comparison appears to be unintentional because the types 'string' and 'number' have no overlap.

    Własne słowa kompilatora. Nietłumaczone — to ten ciąg, który wkleiłeś w wyszukiwarkę.

    Obie strony nigdy nie będą równe, więc porównanie zawsze jest fałszem i kompilator zakłada, że nie o to ci chodziło.

    Odtworzenie

    declare const a: string
    
    if (a === 1) {
    }

    Build potwierdza, że to emituje dokładnie ten kod.

    Dlaczego kompilator tak mówi

    To jedna z niewielu diagnostyk o intencji, a nie o bezpieczeństwie — porównanie wykonałoby się bez problemu i zwracało `false` na zawsze. Najbardziej przydaje się po refaktorze, gdy zmienna, która była unią, została zawężona, a gałąź kiedyś istotna po cichu stała się martwym kodem. Traktuj to jak notatkę, że coś wyżej się zmieniło.

    Naprawy

    1. 01
      declare const a: string
      
      if (a === '1') {
      }

      Porównuj z typem, który faktycznie masz.

    2. 02
      declare const a: string | number
      
      if (a === 1) {
      }

      Albo poszerz zmienną, jeśli naprawdę może być jednym albo drugim. Wtedy porównanie znów ma sens i zawęża `a` do `number` wewnątrz bloku.

    Wniosek

    Porównanie, które kompilator uznaje za bezcelowe, to zwykle gałąź kiedyś osiągalna. Usuń ją albo napraw typ, którego strzegła — nie rzutuj, żeby ją zachować.

    Dokąd dalej

    Błędy