我在下面有一个代码示例,在const cars = x.cars.filter()行中,我得到了一个错误对象,可能未定义x.cars。为了克服这个问题,我添加了一个if(x.cars)之类的if检查。通过添加此代码,我对此代码的代码覆盖范围因果单元测试存在问题。因此,我进行了研究,发现有一个Null断言运算符可以解决此打字稿编译器问题。在这种情况下可以使用Null断言运算符还是我需要考虑的其他事项?
this.carOptions$().pipe(
map((result: any): string => {
return result
.filter(x => x.selected)
.map(x => {
if (x.cars) { //added this condition to overcome object is possibly undefined error
const cars = x.cars
.filter(x => x.selected)
.map(x => x.name)
.join(',');
return `${x.name}~${cars}`;
}
})
})
).subscribe(result => {
this.result = result;
});
计划如下使用Null断言运算符
const cars = x.cars!
.filter(x => x.selected)
.map(x => x.name)
.join(',');
return `${x.name}~${cars}`;
使用!.
运算符后提高测试代码覆盖率是一个谎言。
我认为这不是好习惯。这可能很有用。它可能适合您的情况(如果您完全确定基础对象永远不会null
),但是请不要将其视为灵丹妙药。
为什么这不是一个好习惯?因为如果对象为null
/ undefined
,则代码将以与您未使用此运算符完全相同的方式中断。但是编译器就像您的测试覆盖工具分析器一样,无法抱怨。
相关问答:键入安全导航运算符(?。)或(!。)的脚本,并输入null属性路径
从某种意义上说,使用null断言运算符可以简化您的代码。您跳过了if
。但是,如果cars.x
是null
,则带有的代码if
不会引发错误,而另一个则会引发错误。注意这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句