Spec-Zone.ru › ESLint

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, если вы также хотите требовать наличие пар геттер/сеттер.

Примеры неправильного кода для этого правила:

Открыть в Playground
/*eslint grouped-accessor-pairs: "error"*/

const foo = {
    get a() {
        return this.val;
    },
    b: 1,
    set a(value) {
        this.val = value;
    }
};

const bar = {
    set b(value) {
        this.val = value;
    },
    a: 1,
    get b() {
        return this.val;
    }
}

class Foo {
    set a(value) {
        this.val = value;
    }
    b(){}
    get a() {
        return this.val;
    }
}

const Bar = class {
    static get a() {
        return this.val;
    }
    b(){}
    static set a(value) {
        this.val = value;
    }
}

Примеры правильного кода для этого правила:

Открыть в Playground
/*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":

Открыть в Playground
/*eslint grouped-accessor-pairs: ["error", "getBeforeSet"]*/

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;
    }
}

Примеры правильного кода для этого правила с параметром "getBeforeSet":

Открыть в Playground
/*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":

Открыть в Playground
/*eslint grouped-accessor-pairs: ["error", "setBeforeGet"]*/

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":

Открыть в Playground
/*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 }]:

Открыть в Playground
/*eslint grouped-accessor-pairs: ["error", "anyOrder", { enforceForTSTypes: true }] */

interface I {
    get a(): string,
    between: true,
    set a(value: string): void
}

type T = {
    get a(): string,
    between: true,
    set a(value: string): void
};

Примеры правильного кода для этого правила с ["anyOrder", { enforceForTSTypes: true }]:

Открыть в Playground
/*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, если вы также хотите запретить повторяющиеся имена в определениях классов.

Связанные правила

  • accessor-pairs
  • no-dupe-keys
  • no-dupe-class-members

Версия

Это правило появилось в ESLint v6.7.0.

Дополнительная литература

Сеттер — JavaScript | MDN
developer.mozilla.org
Геттер — JavaScript | MDN
developer.mozilla.org
Классы — JavaScript | MDN
developer.mozilla.org

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/grouped-accessor-pairs

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API