Comparación sin solapamiento
This comparison appears to be unintentional because the types 'string' and 'number' have no overlap.Las palabras del propio compilador. Sin traducir — es la cadena que pegaste en el buscador.
Los dos lados nunca pueden ser iguales, así que la comparación siempre es falsa y el compilador asume que no querías escribirla.
Reproducción
declare const a: string if (a === 1) { }
La compilación afirma que esto emite exactamente este código.
Por qué lo dice el compilador
Es uno de los pocos diagnósticos sobre intención y no sobre seguridad — la comparación se ejecutaría perfectamente y devolvería `false` para siempre. Resulta más útil tras una refactorización, cuando una variable que era una unión se ha acotado y una rama que antes importaba se ha vuelto código muerto en silencio. Tómalo como un aviso de que algo cambió más arriba.
Arreglos
- 01
declare const a: string if (a === '1') { }
Compara con el tipo que realmente tienes.
- 02
declare const a: string | number if (a === 1) { }
O amplía la variable, si de verdad puede ser cualquiera de los dos. Entonces la comparación vuelve a tener propósito y acota `a` a `number` dentro del bloque.
Conclusión
Una comparación que el compilador llama inútil suele ser una rama que antes era alcanzable. Bórrala o arregla el tipo que protegía — no hagas un cast para conservarla.