Lint错误信息:
Src /app/detail/edit/ edit.ponent .ts[111, 5]: for(…在…)
语句必须使用if语句进行筛选
代码片段(这是一个工作代码。它在angular中也可用。IO表单验证部分):
for (const field in this.formErrors) {
// clear previous error message (if any)
this.formErrors[field] = '';
const control = form.get(field);
if (control && control.dirty && !control.valid) {
const messages = this.validationMessages[field];
for (const key in control.errors) {
this.formErrors[field] += messages[key] + ' ';
}
}
}
有什么想法如何修复这个lint错误?
为了解释tslint指出的实际问题,引用
JavaScript文档for…声明:
循环将遍历对象的所有可枚举属性
本身和对象从其构造函数的原型继承的对象
(接近原型链中对象的属性重写
原型的属性)。
所以,基本上这意味着你将得到你可能不希望得到的属性(从对象的原型链)。
为了解决这个问题,我们只需要迭代对象本身的属性。我们可以用两种不同的方式来做到这一点(正如@Maxxx和@Qwertiy所建议的那样)。
第一个解决方案
for (const field of Object.keys(this.formErrors)) {
...
}
这里我们使用object . keys()方法,该方法返回给定对象自身可枚举属性的数组,其顺序与for…In循环(区别在于for-in循环也枚举原型链中的属性)。
第二个解决方案
for (var field in this.formErrors) {
if (this.formErrors.hasOwnProperty(field)) {
...
}
}
在这个解决方案中,我们迭代对象的所有属性,包括它的原型链中的属性,但使用object .prototype. hasownproperty()方法,该方法返回一个布尔值,指示对象是否拥有指定的属性作为自己的(非继承的)属性,以过滤继承的属性。
为了解释tslint指出的实际问题,引用
JavaScript文档for…声明:
循环将遍历对象的所有可枚举属性
本身和对象从其构造函数的原型继承的对象
(接近原型链中对象的属性重写
原型的属性)。
所以,基本上这意味着你将得到你可能不希望得到的属性(从对象的原型链)。
为了解决这个问题,我们只需要迭代对象本身的属性。我们可以用两种不同的方式来做到这一点(正如@Maxxx和@Qwertiy所建议的那样)。
第一个解决方案
for (const field of Object.keys(this.formErrors)) {
...
}
这里我们使用object . keys()方法,该方法返回给定对象自身可枚举属性的数组,其顺序与for…In循环(区别在于for-in循环也枚举原型链中的属性)。
第二个解决方案
for (var field in this.formErrors) {
if (this.formErrors.hasOwnProperty(field)) {
...
}
}
在这个解决方案中,我们迭代对象的所有属性,包括它的原型链中的属性,但使用object .prototype. hasownproperty()方法,该方法返回一个布尔值,指示对象是否拥有指定的属性作为自己的(非继承的)属性,以过滤继承的属性。