Lint错误消息:
src / app / detail / edit / edit.component.ts [111,5]:for(... in ...) 必须使用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错误吗?
答案 0 :(得分:209)
应用@Helzgate回复的一种更简洁的方式可能是用
替换你的'for .. in'for (const field of Object.keys(this.formErrors)) {
答案 1 :(得分:168)
解释tslint指出的实际问题,引用来自 for...in statement的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()方法,该方法返回一个布尔值,指示对象是否具有指定的属性为拥有(不是继承)属性,以过滤掉继承的属性。
答案 2 :(得分:61)
for (const field in this.formErrors) {
if (this.formErrors.hasOwnProperty(field)) {
for (const key in control.errors) {
if (control.errors.hasOwnProperty(key)) {
答案 3 :(得分:12)
使用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] + ' ';
});
}
});
答案 4 :(得分:4)
如果出于您的目的,for(... in ...)的行为是可接受的/必要的,则可以告诉tslint允许它。
在tslint.json中,将其添加到“规则”部分。
"forin": false
否则,@ Maxxx与
有正确的主意for (const field of Object.keys(this.formErrors)) {
答案 5 :(得分:0)
我认为此消息与避免使用switch
有关。相反,它希望您检查hasOwnProperty
。可以在这里阅读背景:https://stackoverflow.com/a/16735184/1374488