メインコンテンツにスキップ

no-dynamic-delete

計算されたキー式で `delete` 演算子を使用することを禁止します。

🔒

拡張 "plugin:@typescript-eslint/"strict" ESLint 設定 で指定すると、このルールが有効になります。

🔧

このルールによって報告される問題の一部は、 `--fix` ESLint コマンドラインオプション.

によって自動的に修正できます。動的に計算されたキーを削除することは危険であり、場合によっては最適化されません。ランタイム定数ではないキーに対して `delete` 演算子を使用することは、間違ったデータ構造を使用している兆候である可能性があります。オブジェクトをキーと値のコレクションとして使用している場合は、`Map` または `Set` の使用を検討してください。

オブジェクトに動的にキーを追加および削除すると、時折エッジケースのバグが発生する可能性があります。たとえば、一部のオブジェクトはプライベートストレージに「非表示のプロパティ」(`__data` など)を使用しており、それらを削除するとオブジェクトの内部状態が壊れる可能性があります。さらに、`delete` は、継承されたプロパティまたは設定不可のプロパティを削除できません。これは、プレーンオブジェクトよりも複雑なものとの相互作用を悪くします。

  • 配列の `length` は設定不可であり、削除するとランタイムエラーが発生します。
  • クラスインスタンスからメソッドを削除するなど、オブジェクトのプロトタイプのプロパティを削除することはできません。
  • 場合によっては、`delete` は自身のプロパティのみを削除し、継承されたプロパティはそのまま残ります。たとえば、関数の `name` プロパティを削除すると、自身のプロパティのみが削除されますが、`Function.prototype.name` プロパティも残っています。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/no-dynamic-delete": "error"
}
};

プレイグラウンドでこのルールを試す ↗

// Dynamic, difficult-to-reason-about lookups
const name = 'name';
delete container[name];
delete container[name.toUpperCase()];
プレイグラウンドで開く

オプション

このルールは設定できません。

使用しない場合

キーの削除が安全であることがわかっている場合は、このルールは不要になる可能性があります。このルールを完全に無効にする代わりに、ESLintの無効化コメントを特定の状況で使用することを検討してください。

コードのボトルネックをプロファイリングする前に、このルールをパフォーマンスアドバイスと見なさないでください。軽微なパフォーマンスの低下が繰り返し発生しても、アプリケーションの全体的な体感速度に大きな影響を与える可能性は低いです。

リソース