跳到主要內容

no-dynamic-delete

禁止在計算的金鑰表達式上使用 delete 運算元。

🔒

延伸 "plugin:@typescript-eslint/strict" in an ESLint 設定檔 啟用這條規則。

🔧

此規則所回報的一些問題可由 --fix ESLint 命令列選項自動修正.

在動態計算的金鑰上刪除可能很危險,且在某些情況下並未最佳化。在不是執行時間常數的金鑰上使用 delete 運算元可能會表示您使用了錯誤的資料結構。如果您將物件用作鍵值集合,請考慮使用 MapSet

動態新增和移除物件的鍵可能偶爾會導致邊界案例錯誤。例如,某些物件會使用「隱藏屬性」(像是 `__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 停用註解,而不是完全停用此規則。

在找出程式碼瓶頸前,請不要將這條規則視為效能建議。即使重複出現小效能減損,也不太可能對應用程式一般被感知的速度帶來重大影響。

資源