no-magic-numbers
Запрещает магические числа
В настоящее время это правило заморожено, и запросы на добавление новых функций не принимаются.
«Магические числа» — это числа, которые встречаются в коде несколько раз без явного значения. Предпочтительно заменять их именованными константами.
const now = Date.now(),
inOneHour = now + (60 * 60 * 1000);
Подробности правила
Правило no-magic-numbers призвано повысить читаемость кода и упростить рефакторинг, обеспечивая объявление специальных чисел в виде констант, чтобы их значение было явным.
Примеры неправильного кода для этого правила:
/*eslint no-magic-numbers: "error"*/
const dutyFreePrice = 100,
finalPrice = dutyFreePrice + (dutyFreePrice * );
/*eslint no-magic-numbers: "error"*/
const data = ['foo', 'bar', 'baz'];
const dataLast = data[];
/*eslint no-magic-numbers: "error"*/
let SECONDS;
SECONDS = ;
Примеры правильного кода для этого правила:
/*eslint no-magic-numbers: "error"*/
const TAX = 0.25;
const dutyFreePrice = 100,
finalPrice = dutyFreePrice + (dutyFreePrice * TAX);
Параметры
ignore
Массив чисел, которые нужно игнорировать. По умолчанию задано значение []. Если параметр указан, его значение должно быть Array.
Массив может содержать значения типов number и string. Если значение является строкой, текст должен разбираться как литерал bigint (например, "100n").
Примеры правильного кода для примера параметра { "ignore": [1] }:
/*eslint no-magic-numbers: ["error", { "ignore": [1] }]*/
const data = ['foo', 'bar', 'baz'];
const dataLast = data.length && data[data.length - 1];
Примеры правильного кода для примера параметра { "ignore": ["1n"] }:
/*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 }:
/*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 }:
/*eslint no-magic-numbers: ["error", { "ignoreArrayIndexes": true }]*/
f(); // not used as array index
a = data[];
a = data[];
a = data[];
a = data[];
a = data[]; // above the max array index
a = data[]; // same as data["Infinity"]
ignoreDefaultValues
Логическое значение, указывающее, допустимы ли числа, используемые при присваивании значений по умолчанию. По умолчанию задано значение false.
Примеры правильного кода для параметра { "ignoreDefaultValues": true }:
/*eslint no-magic-numbers: ["error", { "ignoreDefaultValues": true }]*/
const { tax = 0.25 } = accountancy;
function mapParallel(concurrency = 3) { /***/ }
/*eslint no-magic-numbers: ["error", { "ignoreDefaultValues": true }]*/
let head;
[head = 100] = []
ignoreClassFieldInitialValues
Логическое значение, указывающее, допустимы ли числа, используемые в качестве начальных значений полей класса. По умолчанию задано значение false.
Примеры правильного кода для параметра { "ignoreClassFieldInitialValues": true }:
/*eslint no-magic-numbers: ["error", { "ignoreClassFieldInitialValues": true }]*/
class C {
foo = 2;
bar = -3;
tux = +1;
#baz = 4;
static qux = 5;
}
Примеры неправильного кода для параметра { "ignoreClassFieldInitialValues": true }:
/*eslint no-magic-numbers: ["error", { "ignoreClassFieldInitialValues": true }]*/
class C {
foo = + ;
}
class D {
;
}
enforceConst
Логическое значение, указывающее, нужно ли проверять наличие ключевого слова const в объявлении переменных с числами. По умолчанию задано значение false.
Примеры неправильного кода для параметра { "enforceConst": true }:
/*eslint no-magic-numbers: ["error", { "enforceConst": true }]*/
let TAX = ;
let dutyFreePrice = ,
finalPrice = dutyFreePrice + (dutyFreePrice * TAX);
detectObjects
Логическое значение, указывающее, следует ли обнаруживать числа, например, при присваивании значений свойствам объекта. По умолчанию задано значение false.
Примеры неправильного кода для параметра { "detectObjects": true }:
/*eslint no-magic-numbers: ["error", { "detectObjects": true }]*/
const magic = {
tax:
};
const dutyFreePrice = 100,
finalPrice = dutyFreePrice + (dutyFreePrice * magic.tax);
Примеры правильного кода для параметра { "detectObjects": true }:
/*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 }:
/*eslint no-magic-numbers: ["error", { "ignoreEnums": false }]*/
enum foo {
SECOND = ,
}
Примеры правильного кода для параметра { "ignoreEnums": true }:
/*eslint no-magic-numbers: ["error", { "ignoreEnums": true }]*/
enum foo {
SECOND = 1000,
}
ignoreNumericLiteralTypes (только TypeScript)
Считаются ли допустимыми числа, используемые в числовых литеральных типах TypeScript. По умолчанию задано значение false.
Примеры неправильного кода для параметра { "ignoreNumericLiteralTypes": false }:
/*eslint no-magic-numbers: ["error", { "ignoreNumericLiteralTypes": false }]*/
type Foo = | | ;
Примеры правильного кода для параметра { "ignoreNumericLiteralTypes": true }:
/*eslint no-magic-numbers: ["error", { "ignoreNumericLiteralTypes": true }]*/
type Foo = 1 | 2 | 3;
ignoreReadonlyClassProperties (только TypeScript)
Считаются ли допустимыми числа, используемые в свойствах класса TypeScript, объявленных с модификатором readonly. По умолчанию задано значение false.
Примеры неправильного кода для параметра { "ignoreReadonlyClassProperties": false }:
/*eslint no-magic-numbers: ["error", { "ignoreReadonlyClassProperties": false }]*/
class Foo {
readonly A = ;
readonly B = ;
public static readonly C = ;
static readonly D = ;
}
Примеры правильного кода для параметра { "ignoreReadonlyClassProperties": true }:
/*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 }:
/*eslint no-magic-numbers: ["error", { "ignoreTypeIndexes": false }]*/
type Foo = Bar[];
type Baz = Parameters<Foo>[];
Примеры правильного кода для параметра { "ignoreTypeIndexes": true }:
/*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