Использование операторов сравнения для значений разных типов обычно является ошибкой, поэтому TypeScript предупреждает об этом:
if (1 === "1") {} // error
TypeScript обрабатывает числовые и строковые литералы как их собственные типы , поэтому сравнение двух разных литералов будет ошибкой по той же причине:
if (1 === 2) {} // error
Обратите внимание, что сравнение двух литералов в JavaScript обычно гарантирует известный результат. Для (1 == 2)
возможен только один результат. Так что, как правило, написание этого кода мало что дает, поскольку вы можете заменить его известным результатом: (1 == 2)
можно заменить на false
, а (1 === 1)
можно заменить на true
. Поэтому у сопровождающих языков нет особой причины заботиться о добавлении поддержки сравнения двух разных литералов ... трудно представить действительный вариант использования для сравнения литералов, которые не лучше обслуживаются not Сравнение литералов.
Однако, если вам действительно нужно провести такое сравнение, вы можете расширить (один из) литеральных типов до их общего супертипа, например number
или string
:
if (1 as number == 2) { console.log("nope"); } // works
if ('1' as string == '2') { console.log("nope"); } // works
Вы предлагаете TypeScript рассматривать 1
не как литерал 1
, а как number
, и что можно сравнить с 2
. Но опять же, вам не нужно этого делать. Вместо этого вы можете сделать:
if (false) { console.log("nope"); } // unreachable code detected!
Это новое предупреждение также является хорошим. Обычно недоступный код является признаком ошибки. Лично я предпочел бы просто закомментировать этот код или удалить его, а не оставлять недоступный код. Или просто оставьте ошибку как напоминание о том, что вы должны вернуться и почистить ее.
Однако, если вы действительно хотите, чтобы сценарий if (false) {}
работал без ошибок, более идиоматичным способом сделать это было бы что-то вроде
if (false as boolean) { console.log("nope"); } // works
, когда вы говорите компилятору считать false
просто boolean
, и поэтому он больше не осознает и не заботится о том, что код после условного выражения недоступен.
Надеюсь, это имеет смысл.