Spec-Zone.ru › ESLint

пары-аксессоров

Принудительное наличие пар «получатель» и «установщик» в объектах и классах

В 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 }:

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

var o = {
    set a(value) {
        this.val = value;
    }
};


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

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

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

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

var o = {
    set a(value) {
        this.val = value;
    }
};

var o = {
    get a() {
        return this.val;
    }
};

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

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

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

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

Открыть в 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;
    }
}

Известные ограничения

Из-за ограничений статического анализа, это правило не учитывает возможные побочные эффекты и в некоторых случаях может не сообщать об отсутствующей паре получатель/установщик для свойства с вычисляемым ключом, как в следующем примере:

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

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

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

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

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

Версия

Это правило было добавлено в ESLint v0.22.0.

Дополнительное чтение

установщик - JavaScript | MDN
получатель - JavaScript | MDN
Работа с объектами - JavaScript | MDN

Ресурсы

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

© 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