Spec-Zone.ru › ESLint

no-magic-numbers

Запрещает магические числа

❄️ Заморожено

В настоящее время это правило заморожено, и запросы на добавление новых функций не принимаются.

«Магические числа» — это числа, которые встречаются в коде несколько раз без явного значения. Предпочтительно заменять их именованными константами.

const now = Date.now(),
    inOneHour = now + (60 * 60 * 1000);

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

Правило no-magic-numbers призвано повысить читаемость кода и упростить рефакторинг, обеспечивая объявление специальных чисел в виде констант, чтобы их значение было явным.

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

Открыть в Playground
/*eslint no-magic-numbers: "error"*/

const dutyFreePrice = 100,
    finalPrice = dutyFreePrice + (dutyFreePrice * 0.25);
Открыть в Playground
/*eslint no-magic-numbers: "error"*/

const data = ['foo', 'bar', 'baz'];

const dataLast = data[2];
Открыть в Playground
/*eslint no-magic-numbers: "error"*/

let SECONDS;

SECONDS = 60;

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

Открыть в Playground
/*eslint no-magic-numbers: "error"*/

const TAX = 0.25;

const dutyFreePrice = 100,
    finalPrice = dutyFreePrice + (dutyFreePrice * TAX);

Параметры

ignore

Массив чисел, которые нужно игнорировать. По умолчанию задано значение []. Если параметр указан, его значение должно быть Array.

Массив может содержать значения типов number и string. Если значение является строкой, текст должен разбираться как литерал bigint (например, "100n").

Примеры правильного кода для примера параметра { "ignore": [1] }:

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignore": [1] }]*/

const data = ['foo', 'bar', 'baz'];
const dataLast = data.length && data[data.length - 1];

Примеры правильного кода для примера параметра { "ignore": ["1n"] }:

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignore": ["1n"] }]*/

foo(1n);

ignoreArrayIndexes

Логическое значение, указывающее, допустимы ли числа, используемые в контексте индексов массива (например, data[2]). По умолчанию задано значение false.

Этот параметр разрешает только допустимые индексы массива: числа, которые будут преобразованы в одно из значений "0", "1", "2" … "4294967294".

Массивы являются объектами, поэтому у них могут быть имена свойств, например "-1" или "2.5". Однако это всего лишь «обычные» свойства объекта, не представляющие элементы массива. Они не влияют на length массива и игнорируются такими методами массива, как .map или .forEach.

Кроме того, поскольку максимальная длина массива равна 232 - 1, все значения выше 232 - 2 также представляют собой обычные имена свойств и поэтому не считаются индексами массива.

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreArrayIndexes": true }]*/

const item = data[2];

data[100] = a;

f(data[0]);

a = data[-0]; // same as data[0], -0 will be coerced to "0"
a = data[+1]; // same as data[1], +1 will be coerced to "1"

a = data[0xAB];

a = data[5.6e1];

a = data[10n]; // same as data[10], 10n will be coerced to "10"

a = data[4294967294]; // max array index

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreArrayIndexes": true }]*/

f(2); // not used as array index

a = data[-1];

a = data[2.5];

a = data[5.67e1];

a = data[-10n];

a = data[4294967295]; // above the max array index

a = data[1e500]; // same as data["Infinity"]

ignoreDefaultValues

Логическое значение, указывающее, допустимы ли числа, используемые при присваивании значений по умолчанию. По умолчанию задано значение false.

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreDefaultValues": true }]*/

const { tax = 0.25 } = accountancy;

function mapParallel(concurrency = 3) { /***/ }
Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreDefaultValues": true }]*/

let head;
[head = 100] = []

ignoreClassFieldInitialValues

Логическое значение, указывающее, допустимы ли числа, используемые в качестве начальных значений полей класса. По умолчанию задано значение false.

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreClassFieldInitialValues": true }]*/

class C {
    foo = 2;
    bar = -3;
    tux = +1;
    #baz = 4;
    static qux = 5;
}

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreClassFieldInitialValues": true }]*/

class C {
    foo = 2 + 3;
}

class D {
    2;
}

enforceConst

Логическое значение, указывающее, нужно ли проверять наличие ключевого слова const в объявлении переменных с числами. По умолчанию задано значение false.

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "enforceConst": true }]*/

let TAX = 0.25;

let dutyFreePrice = 100,
    finalPrice = dutyFreePrice + (dutyFreePrice * TAX);

detectObjects

Логическое значение, указывающее, следует ли обнаруживать числа, например, при присваивании значений свойствам объекта. По умолчанию задано значение false.

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "detectObjects": true }]*/

const magic = {
  tax: 0.25
};

const dutyFreePrice = 100,
    finalPrice = dutyFreePrice + (dutyFreePrice * magic.tax);

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "detectObjects": true }]*/

const TAX = 0.25;

const magic = {
  tax: TAX
};

const dutyFreePrice = 100,
    finalPrice = dutyFreePrice + (dutyFreePrice * magic.tax);

ignoreEnums (только TypeScript)

Считаются ли допустимыми перечисления, используемые в TypeScript. По умолчанию задано значение false.

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreEnums": false }]*/

enum foo {
  SECOND = 1000,
}

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreEnums": true }]*/

enum foo {
  SECOND = 1000,
}

ignoreNumericLiteralTypes (только TypeScript)

Считаются ли допустимыми числа, используемые в числовых литеральных типах TypeScript. По умолчанию задано значение false.

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreNumericLiteralTypes": false }]*/

type Foo = 1 | 2 | 3;

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreNumericLiteralTypes": true }]*/

type Foo = 1 | 2 | 3;

ignoreReadonlyClassProperties (только TypeScript)

Считаются ли допустимыми числа, используемые в свойствах класса TypeScript, объявленных с модификатором readonly. По умолчанию задано значение false.

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreReadonlyClassProperties": false }]*/

class Foo {
  readonly A = 1;
  readonly B = 2;
  public static readonly C = 1;
  static readonly D = 1;
}

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreReadonlyClassProperties": true }]*/

class Foo {
  readonly A = 1;
  readonly B = 2;
  public static readonly C = 1;
  static readonly D = 1;
}

ignoreTypeIndexes (только TypeScript)

Допустимы ли числа, используемые для индексации типов. По умолчанию задано значение false.

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreTypeIndexes": false }]*/

type Foo = Bar[0];
type Baz = Parameters<Foo>[2];

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

Открыть в Playground
/*eslint no-magic-numbers: ["error", { "ignoreTypeIndexes": true }]*/

type Foo = Bar[0];
type Baz = Parameters<Foo>[2];

Версия

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

Ресурсы

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

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

Spec-Zone.ru

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