簡體   English   中英

使用 Typescript 時如何避免觸發 eslint 的 for..in

[英]How to avoid triggering eslint's for..in when using Typescript

我目前使用 TypeScript 推薦的方法來迭代對象的鍵。像這樣:

    let key: keyof ExampleObject;
    for (key in exampleObject) {
      // do some work with exampleObject[key];
    }

在我當前的項目中,Eslint 抱怨使用for..in構造如下:

for..in loops iterate over the entire prototype chain, which is virtually never what you want. Use Object.{keys,values,entries}, and iterate over the resulting array      no-restricted-syntax
The body of a for-in should be wrapped in an if statement to filter unwanted properties from the prototype                                                                 guard-for-in

我已經看到 JavaScript 的幾個類似問題和答案,例如使用 Object.keys(...) 但 TypeScript 也不喜歡這種方法,它失去了一些類型安全性。

有沒有辦法避免觸發 Eslint 規則,同時仍然遵守 TypeScript 最佳實踐? 我知道我可以關閉指定的規則,但我希望有一種不那么“hacky”的方式

Eslint 的抱怨有一個非常正當的理由,你基本上不應該使用for...in除非你明確想要遍歷原型鏈,而你基本上從來沒有這樣做過。

至於rest……

TypeScript 也不喜歡這種方法,它失去了一些類型安全性。

是的。 你的問題不是Object.keys ,你的問題是運行時反射和編譯時類型安全是天敵。 所以沒有一個“干凈”的方法來做到這一點,你說“在運行時給我這個 object 的所有屬性”,這在編譯時不能安全地知道,並改變你問的機制因為那不會解決根本的潛在問題。

您有幾種選擇來處理這個問題。

  1. 改變你的方法。 真的需要遍歷 object 的所有鍵嗎? 全部 或者您可以使用已知鍵的編譯時 const 數組嗎?
  2. 使用編譯時清晰的運行時檢查,如instanceoftypeofin運算符等來縮小類型。
  3. 接受類型安全的損失並使用強制轉換來滿足編譯器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM