我正在使用代码覆盖率报告创建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
有人可以解释这些情况吗?
答案 0 :(得分:3)
在不同类型的值上使用比较运算符通常是一个错误,因此TypeScript警告:
if (1 === "1") {} // error
TypeScript将数字和字符串文字视为their own types,因此出于同样的原因,比较两个不同的文字会出错:
if (1 === 2) {} // error
请注意,比较JavaScript中的两个文字通常会保证具有已知结果。 (1 == 2)
只有一个可能的结果。因此,通常编写该代码没有太大用处,因为您可以将其替换为已知结果:(1 == 2)
可以替换为false
,(1 === 1)
可以替换为true
。因此,语言维护者没有太多理由关心添加对比较两个不同文字的支持......很难想象一个有效的用例来比较不能更好地服务的文字比较文字。
但是,如果你真的需要进行这样的比较,你可以将(一个)文字类型扩展到它们的常用超类型,例如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
,因此它不再意识到或关心条件之后的代码无法访问。
希望这是有道理的。
答案 1 :(得分:0)
请一次,谢谢它是数字还是字符串,因为在某些情况下,如果你从其他组件中获取值,它可能/可能不是数字格式,它是在字符串引用的数字中,如'12345'的12345,所以它可能会产生一些问题