tslint / codelyzer / ng lint hatası: “for (… in…) ifadeleri bir if ifadesiyle filtrelenmelidir”


229

Tiftik hata mesajı:

src / app / detail / edit / edit.component.ts [111, 5]: for (... in ...) ifadeleri bir if ifadesiyle filtrelenmelidir

Kod snippet'i (Bu bir çalışma kodudur. Angular.io form doğrulama bölümünde de mevcuttur ):

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

Bu tiftik hatasını nasıl düzeltebilirim?


Belki bir cevabı kabul edebilirsin?
Qwertiy

Yanıtlar:


242

To gerçek sorunu açıklamak tslint işaret olduğunu, JavaScript belgelerine bir alıntı için ... açıklamada :

Döngü, nesnenin kendisinin tüm numaralandırılabilir özellikleri üzerinde yineleyecektir ve nesne, yapıcısının prototipinden (prototip zincirindeki nesneye yakın olan özellikler prototiplerin özelliklerini geçersiz kılar) devralır.

Yani, temelde bu, elde etmeyi beklemediğiniz özellikleri (nesnenin prototip zincirinden) alacağınız anlamına gelir.

Bunu çözmek için sadece nesnelerin kendi özellikleri üzerinde yineleme yapmamız gerekir. Bunu iki farklı şekilde yapabiliriz (@Maxxx ve @Qwertiy tarafından önerildiği gibi).

İlk çözüm

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

Burada, belirli bir nesnenin kendi numaralandırılabilir özelliklerinin bir dizisini, for ... in döngüsü tarafından sağlanan sırayla döndüren Object.Keys () yöntemini kullanırız (fark, bir for-in döngüsünün özellikleri numaralandırmasıdır) prototip zinciri de).

İkinci çözüm

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

Bu çözümde, prototip zincirindeki olanlar da dahil olmak üzere nesnenin tüm özelliklerini yineliyoruz , ancak nesnenin belirtilen özelliğe sahip (miras alınmamış) özelliği olup olmadığını gösteren bir boole döndüren Object.prototype.hasOwnProperty () yöntemini kullanıyoruz. miras alınan özellikler.


2
Bunun Object.keysES5 olduğunu fark etmek istiyorum . ES6'dan gelen tek şey for-loop. Diziyi 0'dan uzunluğuna kadar olağan döngüde yineleyebiliriz ve ES5 olur.
Qwertiy

4
bir kez daha dikkat edin: bir şekilde boşsa this.formErrors, for...inhiçbir şey yapmayın, for ... of Object.keys()hata atarsınız.
user3448806

i ikinci çözümü takip ediyorum ama yine de tüy bırakmayan mesajı görüyorum. Şu an için engelli tiftik.
raj240

2
Neden tavsiye etmiyorsun Object.keys(obj).forEach( key => {...}) ?
Ben Carp

268

@ Helzgate'in cevabını uygulamanın daha temiz bir yolu muhtemelen 'for .. in'

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

6
Bu, sadece sorunu çözmediği gibi, aynı zamanda ek koşullara kıyasla kazan plakası kodunun miktarını da azalttığı için kabul edilen cevap olmalıdır if (this.formErrors.hasOwnProperty(field)).
Denialos

1
Cevaba dikkat edin, kodlarınızı kırabilir. "Düzelttikten" sonra test edin.
ZZZ

3
Bu aslında benim için tslint hatasını kaldırmaz.
HammerN'Songs

7
@ HammerN'Songs için değiştirildi olmadığını kontrol ait yerine için de
Tom

burada da aynı problem. kullanıldıktan sonra hata kaldırılmaz
llamerr 27:18

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

13

Object.keys kullanın:

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

2

For (... in ...) için davranışınız amaçlarınız için kabul edilebilir / gerekli ise, tslint'e izin vermesini söyleyebilirsiniz.

tslint.json içinde, bunu "kurallar" bölümüne ekleyin.

"forin": false

Aksi takdirde, @Maxxx ile doğru fikre sahip

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.