prefer-const
Требовать объявления const для переменных, которые никогда не переназначаются после объявления
Некоторые проблемы, выявленные этим правилом, автоматически исправляются с помощью параметра --fix командной строки
Если переменная никогда не переназначается, использование объявления const предпочтительнее.
Объявление const сообщает читателям, что эта переменная никогда не переназначается, что снижает когнитивную нагрузку и повышает поддерживаемость.
Подробное описание правила
Это правило предназначено для выделения переменных, объявленных с использованием ключевого слова let, но никогда не переназначаемых после первоначальной присваивания.
Примеры неправильного кода для этого правила:
/*eslint prefer-const: "error"*/
// it's initialized and never reassigned.
let = 3;
console.log(a);
let b;
= 0;
console.log(b);
class C {
static {
let a;
= 0;
console.log(a);
}
}
// `i` is redefined (not reassigned) on each loop step.
for (let in [1, 2, 3]) {
console.log(i);
}
// `a` is redefined (not reassigned) on each loop step.
for (let of [1, 2, 3]) {
console.log(a);
}
Примеры правильного кода для этого правила:
/*eslint prefer-const: "error"*/
// using const.
const a = 0;
// it's never initialized.
let b;
console.log(b);
// it's reassigned after initialized.
let c;
c = 0;
c = 1;
console.log(c);
// it's initialized in a different block from the declaration.
let d;
if (true) {
d = 0;
}
console.log(d);
// it's initialized in a different scope.
let e;
class C {
#x;
static {
e = obj => obj.#x;
}
}
// it's initialized at a place that we cannot write a variable declaration.
let f;
if (true) f = 0;
console.log(f);
// `i` gets a new binding each iteration
for (const i in [1, 2, 3]) {
console.log(i);
}
// `a` gets a new binding each iteration
for (const a of [1, 2, 3]) {
console.log(a);
}
// `end` is never reassigned, but we cannot separate the declarations without modifying the scope.
for (let i = 0, end = 10; i < end; ++i) {
console.log(i);
}
// `predicate` is only assigned once but cannot be separately declared as `const`
let predicate;
[object.type, predicate] = foo();
// `g` is only assigned once but cannot be separately declared as `const`
let g;
const h = {};
({ g, c: h.c } = func());
// suggest to use `no-var` rule.
var i = 3;
console.log(i);
Параметры
{
"prefer-const": ["error", {
"destructuring": "any",
"ignoreReadBeforeAssign": false
}]
}
распаковка
Вид способа обращения с переменными при распаковке. Существует 2 значения:
-
"any"(по умолчанию) - Если какие-либо переменные в распаковке должны бытьconst, это правило выдает предупреждение для этих переменных. -
"all"- Если все переменные в распаковке должны бытьconst, это правило выдает предупреждение для переменных. В противном случае, игнорирует их.
Примеры неправильного кода для параметра {"destructuring": "any"} по умолчанию:
/*eslint prefer-const: "error"*/
let {a, } = obj; /*error 'b' is never reassigned, use 'const' instead.*/
a = a + 1;
Примеры правильного кода для параметра {"destructuring": "any"} по умолчанию:
/*eslint prefer-const: "error"*/
// using const.
const {a: a0, b} = obj;
const a = a0 + 1;
// all variables are reassigned.
let {c, d} = obj;
c = c + 1;
d = d + 1;
Примеры неправильного кода для параметра {"destructuring": "all"}:
/*eslint prefer-const: ["error", {"destructuring": "all"}]*/
// all of `a` and `b` should be const, so those are warned.
let {, } = obj; /*error 'a' is never reassigned, use 'const' instead.
'b' is never reassigned, use 'const' instead.*/
Примеры правильного кода для параметра {"destructuring": "all"}:
/*eslint prefer-const: ["error", {"destructuring": "all"}]*/
// 'b' is never reassigned, but all of `a` and `b` should not be const, so those are ignored.
let {a, b} = obj;
a = a + 1;
ignoreReadBeforeAssign
Этот параметр предотвращает конфликты с правилом no-use-before-define (без параметра "nofunc"). Если параметр true указан, это правило проигнорирует переменные, которые считываются между объявлением и первым присваиванием. По умолчанию false.
Примеры правильного кода для параметра {"ignoreReadBeforeAssign": true}:
/*eslint prefer-const: ["error", {"ignoreReadBeforeAssign": true}]*/
let timer;
function initialize() {
if (foo()) {
clearInterval(timer);
}
}
timer = setInterval(initialize, 100);
Примеры правильного кода для параметра {"ignoreReadBeforeAssign": false} по умолчанию:
/*eslint prefer-const: ["error", {"ignoreReadBeforeAssign": false}]*/
const timer = setInterval(initialize, 100);
function initialize() {
if (foo()) {
clearInterval(timer);
}
}
Когда не следует использовать его
Если вы не хотите получать уведомления о переменных, которые никогда не переназначаются после начального присваивания, вы можете безопасно отключить это правило.
Связанные правила
Версия
Это правило было введено в ESLint v0.23.0.
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/prefer-const