优先使用只读
要求私有成员在构造函数之外从未被修改的情况下标记为
readonly
。
🔧
此规则报告的一些问题可以通过 --fix
ESLint 命令行选项 自动修复。
💭
此规则需要 类型信息 才能运行。
私有成员变量(无论是使用 private
修饰符还是私有 #
字段)都不允许在其声明类之外被修改。如果该类从未修改其值,则可以安全地将其标记为 readonly
。
此规则报告在构造函数之外从未被修改的情况下,私有成员是否被标记为 readonly
。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/prefer-readonly": "error"
}
};
在游乐场中尝试此规则 ↗
示例
- ❌ 错误
- ✅ 正确
class Container {
// These member variables could be marked as readonly
private neverModifiedMember = true;
private onlyModifiedInConstructor: number;
#neverModifiedPrivateField = 3;
public constructor(
onlyModifiedInConstructor: number,
// Private parameter properties can also be marked as readonly
private neverModifiedParameter: string,
) {
this.onlyModifiedInConstructor = onlyModifiedInConstructor;
}
}
在游乐场中打开class Container {
// Public members might be modified externally
public publicMember: boolean;
// Protected members might be modified by child classes
protected protectedMember: number;
// This is modified later on by the class
private modifiedLater = 'unchanged';
public mutate() {
this.modifiedLater = 'mutated';
}
// This is modified later on by the class
#modifiedLaterPrivateField = 'unchanged';
public mutatePrivateField() {
this.#modifiedLaterPrivateField = 'mutated';
}
}
在游乐场中打开选项
此规则接受以下选项
type Options = [
{
onlyInlineLambdas?: boolean;
},
];
const defaultOptions: Options = [{ onlyInlineLambdas: false }];
onlyInlineLambdas
您可以在对象中传递 "onlyInlineLambdas": true
作为规则选项,以限制仅检查立即分配了 lambda 值的成员。
{
"@typescript-eslint/prefer-readonly": [
"error",
{ "onlyInlineLambdas": true },
],
}
{ "onlyInlineLambdas": true }
选项的代码示例
- ❌ 错误
- ✅ 正确
何时不使用它
如果您没有尝试强制执行强不可变性保证,则此规则对于您的项目来说可能过于严格。
类型检查的 lint 规则比传统的 lint 规则更强大,但也需要配置 类型检查的 lint。如果您在启用类型检查的规则后遇到性能下降,请参阅 性能故障排除。