Spec-Zone.ru › ESLint

prefer-const

Требуйте объявления const для переменных, которым никогда не присваивается новое значение после объявления

🔧 Можно исправить автоматически

Некоторые проблемы, о которых сообщает это правило, можно исправить автоматически с помощью параметра командной строки --fix

Если переменной никогда не присваивается новое значение, лучше использовать объявление const.

Объявление const сообщает читателям: «этой переменной никогда не присваивается новое значение», снижая когнитивную нагрузку и повышая удобство сопровождения.

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

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

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

Открыть в Playground
/*eslint prefer-const: "error"*/

// it's initialized and never reassigned.
let a = 3;
console.log(a);

let b;
b = 0;
console.log(b);

class C {
    static {
        let a;
        a = 0;
        console.log(a);
    }
}

// `i` is redefined (not reassigned) on each loop step.
for (let i in [1, 2, 3]) {
    console.log(i);
}

// `a` is redefined (not reassigned) on each loop step.
for (let a of [1, 2, 3]) {
    console.log(a);
}

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

Открыть в Playground
/*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
    }]
}

destructuring

Способ обработки переменных при деструктуризации. Возможны 2 значения:

  • "any" (по умолчанию) — если каким-либо переменным при деструктуризации следует присвоить const, это правило выдаёт предупреждение для этих переменных.
  • "all" — если всем переменным при деструктуризации следует присвоить const, это правило выдаёт предупреждение для этих переменных. В противном случае правило их игнорирует.

Примеры неправильного кода для параметра {"destructuring": "any"} по умолчанию:

Открыть в Playground
/*eslint prefer-const: "error"*/

let {a, b} = obj;    /*error 'b' is never reassigned, use 'const' instead.*/
a = a + 1;

Примеры правильного кода для параметра {"destructuring": "any"} по умолчанию:

Открыть в Playground
/*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"}:

Открыть в Playground
/*eslint prefer-const: ["error", {"destructuring": "all"}]*/

// all of `a` and `b` should be const, so those are warned.
let {a, b} = obj;    /*error 'a' is never reassigned, use 'const' instead.
                             'b' is never reassigned, use 'const' instead.*/

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

Открыть в Playground
/*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}:

Открыть в Playground
/*eslint prefer-const: ["error", {"ignoreReadBeforeAssign": true}]*/

let timer;
function initialize() {
    if (foo()) {
        clearInterval(timer);
    }
}
timer = setInterval(initialize, 100);

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

Открыть в Playground
/*eslint prefer-const: ["error", {"ignoreReadBeforeAssign": false}]*/

const timer = setInterval(initialize, 100);
function initialize() {
    if (foo()) {
        clearInterval(timer);
    }
}

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

Если вы не хотите получать уведомления о переменных, которым никогда не присваивается новое значение после первоначального присваивания, это правило можно отключить.

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

  • no-var
  • no-unassigned-vars
  • no-use-before-define

Версия

Это правило появилось в ESLint v0.23.0.

Ресурсы

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

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

Spec-Zone.ru

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