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()];
在游乐场中打开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 禁用注释 针对这些特定情况,而不是完全禁用此规则。
在分析代码瓶颈之前,不要将此规则视为性能建议。即使是重复的轻微性能下降也不太可能显着影响应用程序的整体感知速度。