下面有一个代码示例,在const = x.cars.filter()行中,我得到了一个错误,对象可能是x.cars的未定义。为了克服这个问题,我添加了一个if检查,比如if(x.cars)。通过添加这一点,我对代码覆盖率、业力、单元测试有了问题。因此,我研究并发现有一个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}`;发布于 2020-03-26 00:35:41
在使用!.运算符之后,测试代码覆盖率的提高是一个谎言。
我不认为这是很好的练习。这可能很有用。它可能适合您的情况(如果您完全确定基本对象永远不是null),但请不要将其视为银弹。
为什么这不是一个很好的练习?因为如果对象是null/undefined,您的代码就会以完全相同的方式中断,就好像您没有使用这个操作符一样。但是编译器无法抱怨,就像你的测试封面工具分析器一样。
相关问答:Typescript the safe navigation operator ( ?. ) or (!.) and null property paths
从某种意义上说,您的代码与空断言操作符相比要简单一些。你跳过了if。但是,如果cars.x是null,则带有if的代码不会抛出错误,而其他代码则会抛出错误。注意这件事。
https://stackoverflow.com/questions/60828529
复制相似问题