tslint / codelyzer / ng lint错误:“for(… in …)语句必须使用if语句过滤”

林特错误信息:

src / app / detail / edit / edit.component.ts [111,5]:for(… in …)语句必须用if语句过滤

代码片段(这是一个工作代码,也可以在angular.io表单validation部分获得 ):

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] + ' '; } } } 

任何想法如何解决这个皮棉错误?

应用@ Helzgate的答复一个更好的方法是可能取代你的'for .. in'

 for (const field of Object.keys(this.formErrors)) { 
 for (const field in this.formErrors) { if (this.formErrors.hasOwnProperty(field)) { 
 for (const key in control.errors) { if (control.errors.hasOwnProperty(key)) { 

为了解释 tslint指出的实际问题 ,引用了for … in语句的JavaScript文档:

循环将遍历对象本身的所有可枚举属性,并且这些对象inheritance自其构造函数的原型(靠近原型链中的对象的属性覆盖原型的属性)。

所以,基本上这意味着你会得到你可能不希望得到的属性(来自对象的原型链)。

为了解决这个问题,我们只需要遍历对象自己的属性。 我们可以用两种不同的方法来完成这个工作(如@Maxxx和@Qwertiy所build议的)。

首先解决scheme

 for (const field of Object.keys(this.formErrors)) { ... } 

这里我们利用Object.Keys()方法返回一个给定对象自己的枚举属性的数组,其顺序与for … in循环提供的顺序相同(区别在于for-in循环枚举了原型链也是如此)。

第二种scheme

 for (var field in this.formErrors) { if (this.formErrors.hasOwnProperty(field)) { ... } } 

在这个解决scheme中,我们遍历所有对象的属性,包括原型链中的属性,但使用Object.prototype.hasOwnProperty()方法,该方法返回一个布尔值,指示对象是否具有指定的属性作为自己的属性(未inheritance)inheritance的属性。

使用Object.keys:

 Object.keys(this.formErrors).map(key => { this.formErrors[key] = ''; const control = form.get(key); if(control && control.dirty && !control.valid) { const messages = this.validationMessages[key]; Object.keys(control.errors).map(key2 => { this.formErrors[key] += messages[key2] + ' '; }); } });