Typescript ==不直接使用值。喜欢' if(1 == 2)'不被允许

时间:2018-05-14 13:43:59

标签: angular typescript operators

我正在使用代码覆盖率报告创建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 :(得分:3)

在不同类型的值上使用比较运算符通常是一个错误,因此TypeScript警告:

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

TypeScript将数字和字符串文字视为their own types,因此出于同样的原因,比较两个不同的文字会出错:

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

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

但是,如果你真的需要进行这样的比较,你可以将(一个)文字类型扩展到它们的常用超类型,例如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,因此它不再意识到或关心条件之后的代码无法访问。

希望这是有道理的。

答案 1 :(得分:0)

请一次,谢谢它是数字还是字符串,因为在某些情况下,如果你从其他组件中获取值,它可能/可能不是数字格式,它是在字符串引用的数字中,如'12345'的12345,所以它可能会产生一些问题