Typescript == не работает напрямую со значениями. Как и "если (1 == 2)" не допускается - PullRequest
0 голосов
/ 14 мая 2018

Я создаю приложение Angular с отчетом о покрытии кода.

В одном методе я хочу пропустить некоторую строку, используя некоторое ложное условие, поэтому я попытался написать одну функцию в моем компоненте, например:

sum(num1:number,num2:number){
    if(1 == 2)
    {
        //Some Code
    }
     return num1+num2;
}

Но это выдает мне сообщение об ошибке типа

Оператор '==' нельзя применить к типу '1' и '2'

В некоторых случаях это разрешает, а в некоторых случаях это не позволяет, как:

if(1 != 2) //not allowed
if(1 == 2) //not allowed
if('1' == '2') //not allowed
if(1===2) //not allowed

if(2 == 2) //allowed
if(2 != 2) //allowed
if('1' == '1') //allowed
if(1===1) //allowed
if(parseInt('1') == parseInt('2')) //allowed

Может кто-нибудь объяснить эти сценарии?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Использование операторов сравнения для значений разных типов обычно является ошибкой, поэтому 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, и поэтому он больше не осознает и не заботится о том, что код после условного выражения недоступен.

Надеюсь, это имеет смысл.

0 голосов
/ 14 мая 2018

Пожалуйста, уточните один раз, является ли это число или строка, потому что в некотором сценарии, если вы получаете значения от другого компонента, он может / не может быть в числовом формате, он находится в строковом кавычке, как '12345', вставленное из 12345, поэтомуможет создать какую-то проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...