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()方法,该方法返回一个布尔值,指示对象是否拥有指定的属性作为自己的(非继承的)属性,以过滤继承的属性。

其他回答

用种:

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文档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()方法,该方法返回一个布尔值,指示对象是否拥有指定的属性作为自己的(非继承的)属性,以过滤继承的属性。

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

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