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
- 01
declare const a: string if (a === '1') { }
Porównuj z typem, który faktycznie masz.
- 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ć.