Подтвердить что ты не робот

Tslint/codelyzer/ng lint error: "для (... in...) операторов должны быть отфильтрованы с помощью оператора if"

Сообщение об ошибке Lint:

src/app/detail/edit/edit.component.ts [111, 5]: для (... в...) операторы должны быть отфильтрованы с помощью оператора if

Фрагмент кода (это рабочий код. Он также доступен в angular.io form validation section):

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?

4b9b3361

Ответ 1

Более простой способ применения ответа @Helzgate, возможно, заменит ваш "for.. in" на

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

Ответ 2

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

Ответ 3

Чтобы объяснить фактическую проблему, которую указывает tslint, цитата из документацию JavaScript для... в инструкции:

Цикл будет перебирать все перечислимые свойства объекта сам и те, которые объект наследует от своего прототипа конструктора (свойства, близкие к объекту в переопределении цепи прототипа свойства прототипов).

Итак, в основном это означает, что вы получите свойства, которые вы, возможно, не ожидаете получить (из цепочки прототипов объекта).

Чтобы решить эту проблему, нам нужно выполнить итерацию только по собственным свойствам объектов. Мы можем сделать это двумя разными способами (как предложено @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(), который возвращает логическое значение, указывающее, имеет ли объект указанное свойство как собственное (не наследуемое) свойство, чтобы отфильтровать унаследованные свойства.

Ответ 4

используйте 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] + ' ';
    });
  }
});