no-dynamic-delete
禁止在計算的金鑰表達式上使用
delete
運算元。
🔒
延伸 "plugin:@typescript-eslint/strict"
in an 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()];
在遊樂場中開啟const container: { [i: string]: number } = {
/* ... */
};
// Constant runtime lookups by string index
delete container.aaa;
// Constants that must be accessed by []
delete container[7];
delete container[-1];
// All strings are allowed, to be compatible with the noPropertyAccessFromIndexSignature
// TS compiler option
delete container['aaa'];
delete container['Infinity'];
在遊樂場中開啟選項
此規則無法設定。
何時不應該使用它
當您知道鍵可以安全刪除時,這條規則可以是沒必要的。您可以考慮針對那些特定情況而使用 ESLint 停用註解,而不是完全停用此規則。
在找出程式碼瓶頸前,請不要將這條規則視為效能建議。即使重複出現小效能減損,也不太可能對應用程式一般被感知的速度帶來重大影響。