accessor-pairs
Require a getter for every setter in objects and classes
A property with a setter and no getter can be written but never read. user.name = "Ada" works, but user.name is undefined. Most of the time, someone forgot the getter.
The rule looks at object literals, classes, and the descriptors passed to Object.defineProperty(), Object.defineProperties(), Object.create() and Reflect.defineProperty(). A getter without a setter is a read-only property, so it's allowed by default.
Configure#
Off by default. To turn it on:
bunfig.toml
[lint.rules]
"accessor-pairs" = "error" # or "warn"Every option, set to its default:
bunfig.toml
[lint.rules]
"accessor-pairs" = ["error", {
setWithoutGet = true,
getWithoutSet = false,
enforceForClassMembers = true,
enforceForTSTypes = false,
}]Examples#
example.js1 problem
const user = {
set nameGetter is not present for setter name.(value) {
this._name = value.trim();
},
};example.js1 problem
Object.defineProperty(user, "name", {Getter is not present in property descriptor.
set(value) {
this._name = value.trim();
},
});example.jsNo problems
const user = {
get name() {
return this._name;
},
set name(value) {
this._name = value.trim();
},
};
const config = {
get version() {
return 3;
},
};Options#
| Option | Default | What it does |
|---|---|---|
setWithoutGet | true | Report a setter that has no getter. |
getWithoutSet | false | Report a getter that has no setter. |
enforceForClassMembers | true | Also check classes. A static accessor only pairs with a static one. |
enforceForTSTypes | false | Also check TypeScript interfaces and object types. |
example.jswith
{ "getWithoutSet": true }1 problemconst config = {
get versionSetter is not present for getter version.() {
return 3;
},
};example.jswith
{ "enforceForClassMembers": false }No problemsclass User {
set name(value) {
this._name = value.trim();
}
}example.tswith
{ "enforceForTSTypes": true }1 probleminterface User {
set nameGetter is not present for type setter name.(value: string);
}