Lint сообщение об ошибке:
src / app / detail / edit / edit.component.ts [111, 5]: операторы for (... in ...) должны фильтроваться оператором 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] + ' ';
}
}
}
Есть идеи, как исправить эту ошибку?
angular
angular2-forms
angular-cli
tslint
Choopage - Джек Бао
источник
источник
Ответы:
Чтобы объяснить реальную проблему , на которую указывает tslint, приведем цитату из документации JavaScript оператора for ... in :
Таким образом, в основном это означает, что вы получите свойства, которые вы не ожидаете получить (из цепочки прототипов объекта).
Чтобы решить эту проблему, нам нужно перебирать только собственные свойства объектов. Мы можем сделать это двумя различными способами (как предложено @Maxxx и @Qwertiy).
Первое решение
Здесь мы используем метод Object.Keys (), который возвращает массив собственных перечислимых свойств данного объекта в том же порядке, что и в цикле for ... in (разница в том, что цикл for-in перечисляет свойства в прототип цепи).
Второе решение
В этом решении мы перебираем все свойства объекта, включая свойства его цепочки прототипов, но используем метод Object.prototype.hasOwnProperty () , который возвращает логическое значение, указывающее, имеет ли объект указанное свойство как собственное (не унаследованное) свойство для фильтрации унаследованные свойства.
источник
Object.keys
это ES5. Единственное, что есть у ES6 - это for-of loop. Мы можем перебирать массив в обычном цикле от 0 до его длины, и это будет ES5.this.formErrors
ноль,for...in
просто ничего не делать, покаfor ... of Object.keys()
выдаст ошибку.Object.keys(obj).forEach( key => {...})
?Более точный способ применения ответа @ Helzgate, возможно, состоит в том, чтобы заменить ваше «for .. in» на
источник
if (this.formErrors.hasOwnProperty(field))
.источник
используйте Object.keys:
источник
Если поведение for (... in ...) приемлемо / необходимо для ваших целей, вы можете указать tslint разрешить это.
в tslint.json добавьте это в раздел «правил».
В противном случае, @Maxxx имеет правильную идею с
источник
Я думаю, что это сообщение не о том, чтобы избежать использования
switch
. Вместо этого он хочет, чтобы вы проверилиhasOwnProperty
. Фон можно прочитать здесь: https://stackoverflow.com/a/16735184/1374488источник