grouped-accessor-pairs
Требует группировать пары аксессоров в литералах объектов и классах
Геттер и сеттер одного и того же свойства необязательно должны быть определены рядом друг с другом.
Например, следующие инструкции создадут один и тот же объект:
const o = {
get a() {
return this.val;
},
set a(value) {
this.val = value;
},
b: 1
};
const o1 = {
get a() {
return this.val;
},
b: 1,
set a(value) {
this.val = value;
}
};
Хотя пару для геттера или сеттера можно определить в любом месте определения объекта или класса, рекомендуется группировать функции-аксессоры одного и того же свойства.
Иными словами, если у свойства есть геттер и сеттер, сеттер должен быть определён сразу после геттера или наоборот.
Подробности правила
Это правило требует группировать определения функций-аксессоров одного и того же свойства в литералах объектов, объявлениях классов и выражениях классов.
При желании это правило также может требовать единообразного порядка (getBeforeSet или setBeforeGet).
Это правило не требует наличия пары для геттера или сеттера. См. accessor-pairs, если вы также хотите требовать наличие пар геттер/сеттер.
Примеры неправильного кода для этого правила:
/*eslint grouped-accessor-pairs: "error"*/
const foo = {
get a() {
return this.val;
},
b: 1,
(value) {
this.val = value;
}
};
const bar = {
set b(value) {
this.val = value;
},
a: 1,
() {
return this.val;
}
}
class Foo {
set a(value) {
this.val = value;
}
b(){}
() {
return this.val;
}
}
const Bar = class {
static get a() {
return this.val;
}
b(){}
(value) {
this.val = value;
}
}
Примеры правильного кода для этого правила:
/*eslint grouped-accessor-pairs: "error"*/
const foo = {
get a() {
return this.val;
},
set a(value) {
this.val = value;
},
b: 1
};
const bar = {
set b(value) {
this.val = value;
},
get b() {
return this.val;
},
a: 1
}
class Foo {
set a(value) {
this.val = value;
}
get a() {
return this.val;
}
b(){}
}
const Bar = class {
static get a() {
return this.val;
}
static set a(value) {
this.val = value;
}
b(){}
}
Параметры
Это правило принимает основной строковый параметр и необязательный дополнительный параметр-объект. Строковый параметр задаёт порядок:
-
"anyOrder"(по умолчанию) не задаёт требуемый порядок. -
"getBeforeSet"если у свойства есть геттер и сеттер, требует определить геттер перед сеттером. -
"setBeforeGet"если у свойства есть геттер и сеттер, требует определить сеттер перед геттером.
Необязательный параметр-объект позволяет включить проверку дополнительных типов объектов:
-
enforceForTSTypes: также проверять типы TypeScript (интерфейсы и литеральные типы)
getBeforeSet
Примеры неправильного кода для этого правила с параметром "getBeforeSet":
/*eslint grouped-accessor-pairs: ["error", "getBeforeSet"]*/
const foo = {
set a(value) {
this.val = value;
},
() {
return this.val;
}
};
class Foo {
set a(value) {
this.val = value;
}
() {
return this.val;
}
}
const Bar = class {
static set a(value) {
this.val = value;
}
() {
return this.val;
}
}
Примеры правильного кода для этого правила с параметром "getBeforeSet":
/*eslint grouped-accessor-pairs: ["error", "getBeforeSet"]*/
const foo = {
get a() {
return this.val;
},
set a(value) {
this.val = value;
}
};
class Foo {
get a() {
return this.val;
}
set a(value) {
this.val = value;
}
}
const Bar = class {
static get a() {
return this.val;
}
static set a(value) {
this.val = value;
}
}
setBeforeGet
Примеры неправильного кода для этого правила с параметром "setBeforeGet":
/*eslint grouped-accessor-pairs: ["error", "setBeforeGet"]*/
const foo = {
get a() {
return this.val;
},
(value) {
this.val = value;
}
};
class Foo {
get a() {
return this.val;
}
(value) {
this.val = value;
}
}
const Bar = class {
static get a() {
return this.val;
}
(value) {
this.val = value;
}
}
Примеры правильного кода для этого правила с параметром "setBeforeGet":
/*eslint grouped-accessor-pairs: ["error", "setBeforeGet"]*/
const foo = {
set a(value) {
this.val = value;
},
get a() {
return this.val;
}
};
class Foo {
set a(value) {
this.val = value;
}
get a() {
return this.val;
}
}
const Bar = class {
static set a(value) {
this.val = value;
}
static get a() {
return this.val;
}
}
enforceForTSTypes
Примеры неправильного кода для этого правила с ["anyOrder", { enforceForTSTypes: true }]:
/*eslint grouped-accessor-pairs: ["error", "anyOrder", { enforceForTSTypes: true }] */
interface I {
get a(): string,
between: true,
(value: string): void
}
type T = {
get a(): string,
between: true,
(value: string): void
};
Примеры правильного кода для этого правила с ["anyOrder", { enforceForTSTypes: true }]:
/*eslint grouped-accessor-pairs: ["error", "anyOrder", { enforceForTSTypes: true }] */
interface I {
get a(): string,
set a(value: string): void,
}
type T = {
set a(value: string): void,
get a(): string,
};
Известные ограничения
Из-за ограничений статического анализа это правило не учитывает возможные побочные эффекты и в некоторых случаях может потребовать или не потребовать группировку либо определённый порядок геттеров/сеттеров с вычисляемым ключом, как в следующем примере:
/*eslint grouped-accessor-pairs: "error"*/
let a = 1;
// false warning (false positive)
const foo = {
get [a++]() {
return this.val;
},
b: 1,
set [a++](value) {
this.val = value;
}
};
// missed warning (false negative)
const bar = {
get [++a]() {
return this.val;
},
b: 1,
set [a](value) {
this.val = value;
}
};
Кроме того, это правило не выдаёт предупреждений о свойствах с повторяющимися геттерами или сеттерами.
См. no-dupe-keys, если вы также хотите запретить повторяющиеся ключи в литералах объектов.
См. no-dupe-class-members, если вы также хотите запретить повторяющиеся имена в определениях классов.
Связанные правила
Версия
Это правило появилось в ESLint v6.7.0.
Дополнительная литература
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/grouped-accessor-pairs