accessor-pairs
Требуйте наличия пар геттеров и сеттеров в объектах и классах
В JavaScript часто встречается ошибка: создаётся объект, у свойства которого есть сеттер, но соответствующий геттер не определён. Без геттера прочитать свойство невозможно, поэтому оно в итоге не используется.
Вот несколько примеров:
// Bad
const o = {
set a(value) {
this.val = value;
}
};
// Good
const p = {
set a(value) {
this.val = value;
},
get a() {
return this.val;
}
};
Это правило выдаёт предупреждение, если определены сеттеры без геттеров. Если использовать параметр getWithoutSet, оно также будет выдавать предупреждение, если есть геттер без сеттера.
Описание правила
Это правило требует, чтобы для каждого свойства с определённым сеттером был геттер.
При включении параметра getWithoutSet правило требует наличия сеттера для каждого свойства с определённым геттером.
Это правило всегда проверяет литералы объектов и дескрипторы свойств. По умолчанию оно также проверяет объявления и выражения классов.
Параметры
-
setWithoutGetсо значениемtrueбудет выдавать предупреждения о сеттерах без геттеров (по умолчаниюtrue). -
getWithoutSetсо значениемtrueбудет выдавать предупреждения о геттерах без сеттеров (по умолчаниюfalse). -
enforceForClassMembersсо значениемtrueдополнительно применяет это правило к геттерам и сеттерам классов (по умолчаниюtrue). УстановитеenforceForClassMembersв значениеfalse, если хотите, чтобы это правило игнорировало объявления и выражения классов. -
enforceForTSTypes: значениеtrueдополнительно применяет это правило к определениям типов TypeScript (по умолчаниюfalse).
setWithoutGet
Примеры неправильного кода для параметра { "setWithoutGet": true } по умолчанию:
/*eslint accessor-pairs: "error"*/
const q = {
(value) {
this.val = value;
}
};
const r = {d: 1};
Object.defineProperty(r, 'c', );
Примеры правильного кода для параметра { "setWithoutGet": true } по умолчанию:
/*eslint accessor-pairs: "error"*/
const s = {
set a(value) {
this.val = value;
},
get a() {
return this.val;
}
};
const t = {d: 1};
Object.defineProperty(t, 'c', {
set: function(value) {
this.val = value;
},
get: function() {
return this.val;
}
});
getWithoutSet
Примеры неправильного кода для параметра { "getWithoutSet": true }:
/*eslint accessor-pairs: ["error", { "getWithoutSet": true }]*/
const u = {
(value) {
this.val = value;
}
};
const v = {
() {
return this.val;
}
};
const w = {d: 1};
Object.defineProperty(w, 'c', );
const x = {d: 1};
Object.defineProperty(x, 'c', );
Примеры правильного кода для параметра { "getWithoutSet": true }:
/*eslint accessor-pairs: ["error", { "getWithoutSet": true }]*/
const y = {
set a(value) {
this.val = value;
},
get a() {
return this.val;
}
};
const z = {d: 1};
Object.defineProperty(z, 'c', {
set: function(value) {
this.val = value;
},
get: function() {
return this.val;
}
});
enforceForClassMembers
Если enforceForClassMembers имеет значение true (по умолчанию):
-
"getWithoutSet": trueтакже будет выдавать предупреждения о геттерах без сеттеров в классах. -
"setWithoutGet": trueтакже будет выдавать предупреждения о сеттерах без геттеров в классах.
Примеры неправильного кода для { "getWithoutSet": true, "enforceForClassMembers": true }:
/*eslint accessor-pairs: ["error", { "getWithoutSet": true, "enforceForClassMembers": true }]*/
class Foo {
() {
return this.val;
}
}
class Bar {
() {
return this.val;
}
}
const Baz = class {
() {
return this.val;
}
(value) {
this.val = value;
}
}
Примеры неправильного кода для { "setWithoutGet": true, "enforceForClassMembers": true }:
/*eslint accessor-pairs: ["error", { "setWithoutGet": true, "enforceForClassMembers": true }]*/
class Foo {
(value) {
this.val = value;
}
}
const Bar = class {
(value) {
this.val = value;
}
}
Если enforceForClassMembers имеет значение false, это правило игнорирует классы.
Примеры правильного кода для { "getWithoutSet": true, "setWithoutGet": true, "enforceForClassMembers": false }:
/*eslint accessor-pairs: ["error", {
"getWithoutSet": true, "setWithoutGet": true, "enforceForClassMembers": false
}]*/
class Foo {
get a() {
return this.val;
}
}
class Bar {
static set a(value) {
this.val = value;
}
}
const Baz = class {
static get a() {
return this.val;
}
}
const Quux = class {
set a(value) {
this.val = value;
}
}
enforceForTSTypes
Если enforceForTSTypes имеет значение true:
-
"getWithoutSet": trueтакже будет выдавать предупреждения о геттерах без сеттеров в типах TypeScript. -
"setWithoutGet": trueтакже будет выдавать предупреждения о сеттерах без геттеров в типах TypeScript.
Примеры неправильного кода для { "getWithoutSet": true, "enforceForTSTypes": true }:
/*eslint accessor-pairs: ["error", { "getWithoutSet": true, "enforceForTSTypes": true }]*/
interface I {
(): string
}
type T = {
(): number
}
Примеры неправильного кода для { "setWithoutGet": true, "enforceForTSTypes": true }:
/*eslint accessor-pairs: ["error", { "setWithoutGet": true, "enforceForTSTypes": true }]*/
interface I {
(value: unknown): void
}
type T = {
(value: unknown): void
}
Если enforceForTSTypes имеет значение false, это правило игнорирует типы TypeScript.
Примеры правильного кода для { "getWithoutSet": true, "setWithoutGet": true, "enforceForTSTypes": false }:
/*eslint accessor-pairs: ["error", {
"getWithoutSet": true, "setWithoutGet": true, "enforceForTSTypes": false
}]*/
interface I {
get a(): string
}
type T = {
set a(value: unknown): void
}
Известные ограничения
Из-за ограничений статического анализа это правило не учитывает возможные побочные эффекты и в некоторых случаях может не сообщить об отсутствующей паре геттера и сеттера с вычисляемым ключом, как в следующем примере:
/*eslint accessor-pairs: "error"*/
const z = 1;
// no warnings
const a = {
get [z++]() {
return this.val;
},
set [z++](value) {
this.val = value;
}
};
Кроме того, это правило не запрещает дублирование ключей в литералах объектов и определениях классов, а в некоторых случаях при наличии дублирующихся ключей может не сообщить об отсутствующей паре геттера и сеттера, как в следующем примере:
/*eslint accessor-pairs: "error"*/
// no warnings
const b = {
get a() {
return this.val;
},
a: 1,
set a(value) {
this.val = value;
}
};
Приведённый выше код создаёт объект, у свойства "a" которого есть только сеттер.
См. no-dupe-keys, если вы также хотите запретить дублирование ключей в литералах объектов.
См. no-dupe-class-members, если вы также хотите запретить дублирование имён в определениях классов.
Когда не следует использовать это правило
Вы можете отключить это правило, если вас не беспокоит одновременное наличие сеттеров и геттеров в объектах.
Связанные правила
Версия
Это правило появилось в ESLint v0.22.0.
Дополнительные материалы
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/accessor-pairs