Spec-Zone.ru › ESLint

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 } по умолчанию:

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

const q = {
    set a(value) {
        this.val = value;
    }
};


const r = {d: 1};
Object.defineProperty(r, 'c', {set:function(value){this.val = value;}});

Примеры правильного кода для параметра { "setWithoutGet": true } по умолчанию:

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

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

const u = {
    set a(value) {
        this.val = value;
    }
};

const v = {
    get a() {
        return this.val;
    }
};

const w = {d: 1};
Object.defineProperty(w, 'c', {set:function(value){this.val = value;}});

const x = {d: 1};
Object.defineProperty(x, 'c', {get:function(){returnthis.val;}});

Примеры правильного кода для параметра { "getWithoutSet": true }:

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

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

class Foo {
    get a() {
        return this.val;
    }
}

class Bar {
    static get a() {
        return this.val;
    }
}

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

Примеры неправильного кода для { "setWithoutGet": true, "enforceForClassMembers": true }:

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

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

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

Если enforceForClassMembers имеет значение false, это правило игнорирует классы.

Примеры правильного кода для { "getWithoutSet": true, "setWithoutGet": true, "enforceForClassMembers": false }:

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

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

interface I {
    get a(): string
}

type T = {
    get a(): number
}

Примеры неправильного кода для { "setWithoutGet": true, "enforceForTSTypes": true }:

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

interface I {
    set a(value: unknown): void
}

type T = {
    set a(value: unknown): void
}

Если enforceForTSTypes имеет значение false, это правило игнорирует типы TypeScript.

Примеры правильного кода для { "getWithoutSet": true, "setWithoutGet": true, "enforceForTSTypes": false }:

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

Когда не следует использовать это правило

Вы можете отключить это правило, если вас не беспокоит одновременное наличие сеттеров и геттеров в объектах.

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

  • no-dupe-keys
  • no-dupe-class-members

Версия

Это правило появилось в ESLint v0.22.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/accessor-pairs

Spec-Zone.ru

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