Typescript == 不直接使用值。不允许点赞 'if(1==2)'

Typescript == not working directly with values. Like 'if(1==2)' is not allowed

我正在创建 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

谁能解释一下这些场景?

请检查一下它是数字还是字符串,因为在某些情况下,如果您从其他组件获取值,它 may/may 不是数字格式,而是字符串引用的数字,例如“12345” 12345,所以它可能会产生一些问题

对不同类型的值使用比较运算符通常会出错,因此 TypeScript 会发出警告:

if (1 === "1") {} // error

TypeScript 将数字和字符串字面量视为 their own types,因此比较两个不同的字面量将出错,原因相同:

if (1 === 2) {} // error

请注意,比较 JavaScript 中的两个文字通常可以保证得到已知结果。 (1 == 2) 只有一种可能的结果。所以通常编写该代码没有多大用处,因为您可以将其替换为已知结果:(1 == 2) 可以替换为 false(1 === 1) 可以替换为 true .因此,语言维护者没有太多理由关心添加对比较两个不同文字的支持......很难想象一个有效的比较文字的用例 not 比较文字。

但是,如果您确实需要进行这样的比较,您可以将(其中一种)文字类型扩展为它们的通用超类型,例如 numberstring:

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,因此它不再意识到或关心条件后的代码无法访问。

希望这是有道理的。