Tslint / codelyzer / ng lint error: "for(…)语句必须使用if语句"

Lint错误信息:

src/app/detail/edit/ edit.ponent .ts[11,5]: for(…)在…) 语句必须使用if语句

进行过滤

代码片段(这是一个工作代码。它也可以在角。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错误?

154627 次浏览
for (const field in this.formErrors) {
if (this.formErrors.hasOwnProperty(field)) {
for (const key in control.errors) {
if (control.errors.hasOwnProperty(key)) {

用种:

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

使用@Helzgate的回复的一个更简洁的方法可能是替换你的“for ..”在“

for (const field of Object.keys(this.formErrors)) {
对tslint指向的解释实际问题的引用 为…在声明中的JavaScript文档
循环将遍历对象的所有可枚举属性 本身和对象从其构造函数的原型继承的对象 (接近原型链中对象的属性重写 原型的属性). < / p >

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

为了解决这个问题,我们只需要迭代对象本身的属性。我们可以用两种不同的方式来做到这一点(正如@Maxxx和@Qwertiy所建议的那样)。

第一个解决方案

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

这里我们使用种()方法,该方法返回给定对象自身可枚举属性的数组,其顺序与for…In循环(区别在于for-in循环也枚举原型链中的属性)。

第二个解决方案

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

在这个解决方案中,我们迭代对象的所有属性,包括它的原型链中的属性,但使用Object.prototype.hasOwnProperty ()方法,该方法返回一个布尔值,指示对象是否具有指定的属性作为own(非继承)属性,以过滤继承的属性。

我认为这条信息不是关于避免使用switch。相反,它希望你检查hasOwnProperty。背景可以在这里阅读:https://stackoverflow.com/a/16735184/1374488

如果for的行为……)对于您的目的是可接受的/必要的,您可以告诉tslint允许它。

在tslint。Json,将其添加到“规则”部分。

"forin": false

否则,@Maxxx的想法是正确的

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