Spec-Zone.ru › ESLint

группированные-пары-аксессоров

Требует группировку пар аксессоров в объектных литералах и классах

Геттер и сеттер для одного и того же свойства не обязательно должны быть определены рядом друг с другом.

Например, следующие операторы создадут один и тот же объект:

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

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

Хотя разрешено определять пару для геттера или сеттера где угодно в определении объекта или класса, считается лучшей практикой группировать функции аксессоров для одного и того же свойства.

Другими словами, если свойство имеет геттер и сеттер, сеттер должен быть определён сразу после геттера, или наоборот.

Подробное описание правила

Это правило требует группированных определений функций аксессоров для одного и того же свойства в объектных литералах, объявлениях классов и выражениях классов.

По желанию, это правило также может обеспечить согласованный порядок (getBeforeSet или setBeforeGet).

Это правило не требует существования пары для геттера или сеттера. Обратитесь к accessor-pairs, если вы также хотите принудительно создавать пары геттер/сеттер.

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

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

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

var 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"*/

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

var 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" если свойство имеет и геттер, и сеттер, требует определения сеттера до геттера.

getBeforeSet

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

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

var 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"]*/

var 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"]*/

var 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"]*/

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

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

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

/*eslint grouped-accessor-pairs: "error"*/

var a = 1;

// false warning (false positive)
var foo = {
    get [a++]() {
        return this.val;
    },
    b: 1,
    set [a++](value) {
        this.val = value;
    }
};

// missed warning (false negative)
var 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
геттер - JavaScript | MDN
Классы - JavaScript | MDN

Ресурсы

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

© 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