web-dev-qa-db-de.com

tslint / codelyzer / ng lint error: "für (... in ...) Anweisungen muss mit einer if-Anweisung gefiltert werden"

Fusselfehlermeldung:

src/app/detail/edit/edit.component.ts [111, 5]: Für (... in ...) Anweisungen muss mit einer if-Anweisung gefiltert werden

Code-Snippet (Es ist ein funktionierender Code. Es ist auch unter angle.io Form Validation Section verfügbar.):

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

Irgendeine Idee, wie man diesen Fusselfehler behebt?

176

Eine bessere Möglichkeit, die Antwort von @ Helzgate anzuwenden, besteht möglicherweise darin, Ihr 'for .. in' durch zu ersetzen

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

Um das eigentliche Problem zu erklären , auf das tslint hinweist, ein Zitat aus der JavaScript-Dokumentation des für ... in Anweisung :

Die Schleife durchläuft alle aufzählbaren Eigenschaften des Objekts selbst und diejenigen, die das Objekt vom Prototyp seines Konstruktors erbt (Eigenschaften, die näher am Objekt in der Prototypenkette liegen, überschreiben die Eigenschaften der Prototypen).

Im Grunde bedeutet dies, dass Sie Eigenschaften erhalten, die Sie möglicherweise nicht erwarten (aus der Prototypenkette des Objekts).

Um dies zu lösen, müssen wir nur die Objekteigenschaften durchlaufen. Wir können dies auf zwei verschiedene Arten tun (wie von @Maxxx und @Qwertiy vorgeschlagen).

Erste Lösung

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

Hier verwenden wir die Object.Keys () -Methode, die ein Array der eigenen aufzählbaren Eigenschaften eines Objekts in derselben Reihenfolge zurückgibt, in der diese von einer for ... in-Schleife bereitgestellt werden (der Unterschied ist, dass a Die for-in-Schleife listet auch die Eigenschaften in der Prototypenkette auf.

Zweite Lösung

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

In dieser Lösung werden alle Eigenschaften des Objekts einschließlich der in seiner Prototypenkette enthaltenen iteriert. Verwenden Sie jedoch die Object.prototype.hasOwnProperty () -Methode, die einen Booleschen Wert zurückgibt, der angibt, ob das Objekt die angegebene Eigenschaft besitzt ( nicht geerbte Eigenschaft), um die geerbten Eigenschaften herauszufiltern.

189
akrabi
for (const field in this.formErrors) {
  if (this.formErrors.hasOwnProperty(field)) {
for (const key in control.errors) {
  if (control.errors.hasOwnProperty(key)) {
67
Qwertiy

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