пары-аксессоров
Принудительное наличие пар «получатель» и «установщик» в объектах и классах
В JavaScript часто допускается ошибка: создание объекта с установщиком свойства, но без соответствующего получателя. Без получателя вы не можете прочитать свойство, и оно в итоге не используется.
Вот несколько примеров:
// Bad
var o = {
set a(value) {
this.val = value;
}
};
// Good
var o = {
set a(value) {
this.val = value;
},
get a() {
return this.val;
}
};
Эта правило предупреждает, если установщики определены без получателей. Используя опцию getWithoutSet, оно будет предупреждать, если у вас есть получатель без установщика.
Подробности правила
Это правило навязывает стиль, в котором для каждого свойства, имеющего установщик, требуется получатель.
Активировав опцию getWithoutSet, вы навязываете наличие установщика для каждого свойства, имеющего получатель.
Это правило всегда проверяет литералы объектов и описатели свойств. По умолчанию оно также проверяет объявления классов и выражения классов.
Параметры
-
setWithoutGetустановленное наtrueбудет предупреждать об установщиках без получателей (По умолчаниюtrue). -
getWithoutSetустановленное наtrueбудет предупреждать о получателях без установщиков (По умолчаниюfalse). -
enforceForClassMembersустановленное наtrueдополнительно применяет это правило к получателям/установщикам классов (По умолчаниюtrue). УстановитеenforceForClassMembersнаfalse, если вы хотите, чтобы это правило игнорировало объявления и выражения классов.
setWithoutGet
Примеры некорректного кода для опции по умолчанию { "setWithoutGet": true }:
/*eslint accessor-pairs: "error"*/
var o = {
(value) {
this.val = value;
}
};
var o = {d: 1};
Object.defineProperty(o, 'c', );
Примеры корректного кода для опции по умолчанию { "setWithoutGet": true }:
/*eslint accessor-pairs: "error"*/
var o = {
set a(value) {
this.val = value;
},
get a() {
return this.val;
}
};
var o = {d: 1};
Object.defineProperty(o, 'c', {
set: function(value) {
this.val = value;
},
get: function() {
return this.val;
}
});
getWithoutSet
Примеры некорректного кода для опции { "getWithoutSet": true }:
/*eslint accessor-pairs: ["error", { "getWithoutSet": true }]*/
var o = {
(value) {
this.val = value;
}
};
var o = {
() {
return this.val;
}
};
var o = {d: 1};
Object.defineProperty(o, 'c', );
var o = {d: 1};
Object.defineProperty(o, 'c', );
Примеры корректного кода для опции { "getWithoutSet": true }:
/*eslint accessor-pairs: ["error", { "getWithoutSet": true }]*/
var o = {
set a(value) {
this.val = value;
},
get a() {
return this.val;
}
};
var o = {d: 1};
Object.defineProperty(o, 'c', {
set: function(value) {
this.val = value;
},
get: function() {
return this.val;
}
});
Принудительное применение к членам класса
Когда 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;
}
}
Известные ограничения
Из-за ограничений статического анализа, это правило не учитывает возможные побочные эффекты и в некоторых случаях может не сообщать об отсутствующей паре получатель/установщик для свойства с вычисляемым ключом, как в следующем примере:
/*eslint accessor-pairs: "error"*/
var a = 1;
// no warnings
var o = {
get [a++]() {
return this.val;
},
set [a++](value) {
this.val = value;
}
};
Также это правило не запрещает дублирование ключей в литералах объектов и определениях классов, и в некоторых случаях с дубликатами ключей может не сообщать об отсутствующей паре получатель/установщик, как в следующем примере:
/*eslint accessor-pairs: "error"*/
// no warnings
var o = {
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