跳至主要內容

no-unsafe-enum-comparison

禁止將列舉值與非列舉值進行比較。

💡

此規則報告的一些問題可以通過編輯器的 建議.

手動修復。

💭 此規則需要 類型資訊

才能運行。

enum Vegetable {
Asparagus = 'asparagus',
}

declare const vegetable: Vegetable;

vegetable === 'asparagus'; // No error

TypeScript 編譯器在處理列舉時可能會出奇地寬鬆。字串列舉通常被認為比數字列舉更安全,但即使是字串列舉也有一些陷阱。例如,允許將列舉值與字面量進行比較

  • 上面的程式碼片段應該寫成 vegetable === Vegetable.Asparagus。允許在比較中使用字面量從根本上破壞了使用列舉的目的。通過強制與正確類型的列舉進行比較
  • 它使程式碼庫對列舉成員值的更改更具彈性。
  • 它允許程式碼 IDE 使用「重新命名符號」功能快速重新命名列舉。
它使程式碼與正確的列舉語義保持一致,即通過名稱引用它們並將其值視為實作細節。
module.exports = {
"rules": {
"@typescript-eslint/no-unsafe-enum-comparison": "error"
}
};

.eslintrc.cjs

在 Playground 中試試這個規則 ↗

enum Fruit {
Apple,
}

declare let fruit: Fruit;

fruit === 0;
✅ 正確
enum Vegetable {
Asparagus = 'asparagus',
}

declare let vegetable: Vegetable;

vegetable === 'asparagus';
✅ 正確

在 Playground 中開啟

選項

此規則不可配置。

何時不使用

如果您不介意將數字和/或字面量字串常數與列舉進行比較,則可能不需要此規則。


另外,在極少數情況下,依賴僅作為 type 導入的第三方列舉時,可能難以遵守此規則。您可以考慮針對這些特定情況使用 ESLint 禁用註解,而不是完全禁用此規則。

類型檢查 lint 規則比傳統 lint 規則更強大,但也需要配置 類型檢查 lint。如果您在啟用類型檢查規則後遇到效能下降,請參閱 效能疑難排解