Spec-Zone.ru › ESLint

no-restricted-properties

Запрещает определённые свойства у определённых объектов

В кодовой базе можно запретить определённые свойства объектов. Это полезно, если нужно объявить API устаревшим или ограничить использование методов модуля. Например, можно запретить использование describe.only при работе с Mocha или рекомендовать использовать Object.assign вместо _.extend.

Описание правила

Это правило проверяет обращение к заданному ключу свойства у объекта с заданным именем — как при чтении значения свойства, так и при вызове его в качестве функции. Можно указать необязательное сообщение с указанием альтернативного API или причины ограничения. Правило распространяется как на обращение к свойствам через точечную нотацию, так и на деструктуризацию.

Параметры

Правилу передаётся список объектов, в котором указываются имя объекта и имена свойств:

{
    "rules": {
        "no-restricted-properties": [2, {
            "object": "disallowedObjectName",
            "property": "disallowedPropertyName"
        }]
    }
}

Можно запретить несколько сочетаний объектов и свойств, а также указать необязательное сообщение:

{
    "rules": {
        "no-restricted-properties": [2, {
            "object": "disallowedObjectName",
            "property": "disallowedPropertyName"
        }, {
            "object": "disallowedObjectName",
            "property": "anotherDisallowedPropertyName",
            "message": "Please use allowedObjectName.allowedPropertyName."
        }]
    }
}

Если имя объекта не указано, свойство запрещается для всех объектов:

{
    "rules": {
        "no-restricted-properties": [2, {
            "property": "__defineGetter__",
            "message": "Please use Object.defineProperty instead."
        }]
    }
}

Если имя свойства не указано, запрещается обращение к любому свойству заданного объекта:

{
    "rules": {
        "no-restricted-properties": [2, {
            "object": "require",
            "message": "Please call require() directly."
        }]
    }
}

Чтобы глобально ограничить свойство, но разрешить его использование для определённых объектов, можно использовать параметр allowObjects:

{
    "rules": {
        "no-restricted-properties": [2, {
            "property": "push",
            "allowObjects": ["router"],
            "message": "Prefer [...array, newValue] because it does not mutate the array in place."
        }]
    }
}

Чтобы ограничить все свойства объекта, кроме определённых, можно использовать параметр allowProperties:

{
    "rules": {
        "no-restricted-properties": [2, {
            "object": "config",
            "allowProperties": ["settings", "version"],
            "message": "Accessing other properties is restricted."
        }]
    }
}

Обратите внимание, что параметр allowObjects нельзя использовать вместе с параметром object, поскольку они взаимоисключающие. Аналогично, параметр allowProperties нельзя использовать вместе с параметром property, поскольку они также взаимоисключающие.

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

Открыть в Playground
/* eslint no-restricted-properties: [2, {
    "object": "disallowedObjectName",
    "property": "disallowedPropertyName"
}] */

const example = disallowedObjectName.disallowedPropertyName; /*error Disallowed object property: disallowedObjectName.disallowedPropertyName.*/

disallowedObjectName.disallowedPropertyName(); /*error Disallowed object property: disallowedObjectName.disallowedPropertyName.*/
Открыть в Playground
/* eslint no-restricted-properties: [2, {
    "property": "__defineGetter__"
}] */

foo.__defineGetter__(bar, baz);

const { __defineGetter__ } = qux();

({ __defineGetter__ }) => {};
Открыть в Playground
/* eslint no-restricted-properties: [2, {
    "object": "require"
}] */

require.resolve('foo');
Открыть в Playground
/* eslint no-restricted-properties: [2, {
    "property": "push",
    "allowObjects": ["router"],
}] */

myArray.push(5);
Открыть в Playground
/* eslint no-restricted-properties: [2, {
    "object": "config",
    "allowProperties": ["settings", "version"]
}] */

config.apiKey = "12345";
config.timeout = 5000;

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

Открыть в Playground
/* eslint no-restricted-properties: [2, {
    "object": "disallowedObjectName",
    "property": "disallowedPropertyName"
}] */

const example = disallowedObjectName.somePropertyName;

allowedObjectName.disallowedPropertyName();
Открыть в Playground
/* eslint no-restricted-properties: [2, {
    "object": "require"
}] */

require('foo');
Открыть в Playground
/* eslint no-restricted-properties: [2, {
    "property": "push",
    "allowObjects": ["router", "history"],
}] */

router.push('/home');
history.push('/about');
Открыть в Playground
/* eslint no-restricted-properties: [2, {
    "object": "config",
    "allowProperties": ["settings", "version"]
}] */

config.settings = { theme: "dark" };
config.version = "1.0.0";  

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

Если у вас нет сочетаний объектов и свойств, которые нужно ограничить, не используйте это правило.

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

  • no-restricted-globals
  • no-restricted-syntax

Версия

Это правило появилось в ESLint v3.5.0.

Ресурсы

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

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-restricted-properties

Spec-Zone.ru

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