no-unsafe-enum-comparison
列挙型値と列挙型以外の値の比較を禁止します。
✅
拡張 "plugin:@typescript-eslint/recommended-type-checked"
を ESLint設定で 有効にすると、このルールが有効になります。
💡
このルールで報告される問題の中には、エディターのサジェスチョンによって手動で修正できるものもあります。 サジェスチョン.
💭
このルールを実行するには 型情報が 必要です。
TypeScriptコンパイラは、列挙型を扱う際に驚くほど寛容です。文字列列挙型は数値列挙型よりも安全であると広く考えられていますが、文字列列挙型にもいくつかの落とし穴があります。たとえば、列挙型値をリテラルと比較することは許可されています。
enum Vegetable {
Asparagus = 'asparagus',
}
declare const vegetable: Vegetable;
vegetable === 'asparagus'; // No error
上記のコードスニペットは、代わりに`vegetable === Vegetable.Asparagus`として記述する必要があります。比較にリテラルを許可すると、そもそも列挙型を使用する意味がなくなります。適切に型指定された列挙型との比較を強制することで
- コードベースは列挙型のメンバーの値が変更されてもより堅牢になります。
- コードIDEで「シンボルの名前変更」機能を使用して列挙型をすばやく名前変更できます。
- 名前で参照し、その値を実装の詳細として扱うという列挙型の適切なセマンティクスにコードを合わせます。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-unsafe-enum-comparison": "error"
}
};
このルールをPlaygroundでお試しください ↗
例
- ❌ 正しくない
- ✅ 正しい
enum Fruit {
Apple,
}
declare let fruit: Fruit;
fruit === 0;
Playgroundで開くenum Vegetable {
Asparagus = 'asparagus',
}
declare let vegetable: Vegetable;
vegetable === 'asparagus';
Playgroundで開くenum Fruit {
Apple,
}
declare let fruit: Fruit;
fruit === Fruit.Apple;
Playgroundで開くenum Vegetable {
Asparagus = 'asparagus',
}
declare let vegetable: Vegetable;
vegetable === Vegetable.Asparagus;
Playgroundで開くオプション
このルールは設定できません。
使用しない場合
数値やリテラル文字列定数を列挙型と比較することに問題がない場合は、このルールは必要ない可能性があります。
個別に、`type`としてのみインポートされるサードパーティの列挙型に依存するまれなケースでは、このルールに従うことが困難になる場合があります。このルール全体を無効にする代わりに、ESLintの無効化コメントをこれらの特定の状況で使用することを検討してください。
型チェック付きのlintルールは従来のlintルールよりも強力ですが、型チェック付きのlintingの設定も必要です。型チェック付きのルールを有効にした後にパフォーマンスの低下が発生した場合は、パフォーマンスに関するトラブルシューティングを参照してください。