Skip to content

useConst

  • Rule available since: v1.0.0
  • Diagnostic Category: lint/style/useConst
  • This rule is recommended, which means is enabled by default.
  • This rule has a safe fix.
  • The default severity of this rule is warning.
  • Sources:

Require const declarations for variables that are only assigned once.

Variables that are initialized and never reassigned and variables that are only assigned once can be declared as const.

let a = 3;
console.log(a);
code-block.js:1:1 lint/style/useConst  FIXABLE  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

This let declares a variable that is only assigned once.

> 1 │ let a = 3;
^^^
2 │ console.log(a);
3 │

‘a’ is never reassigned.

> 1 │ let a = 3;
^
2 │ console.log(a);
3 │

Safe fix: Use const instead.

1 - let·a·=·3;
1+ const·a·=·3;
2 2 console.log(a);
3 3

// `a` is redefined (not reassigned) on each loop step.
for (let a of [1, 2, 3]) {
console.log(a);
}
code-block.js:2:6 lint/style/useConst  FIXABLE  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

This let declares a variable that is only assigned once.

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

‘a’ is never reassigned.

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

Safe fix: Use const instead.

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

// `a` is redefined (not reassigned) on each loop step.
for (let a in [1, 2, 3]) {
console.log(a);
}
code-block.js:2:6 lint/style/useConst  FIXABLE  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

This let declares a variable that is only assigned once.

1 │ // a is redefined (not reassigned) on each loop step.
> 2 │ for (let a in [1, 2, 3]) {
^^^
3 │ console.log(a);
4 │ }

‘a’ is never reassigned.

1 │ // a is redefined (not reassigned) on each loop step.
> 2 │ for (let a in [1, 2, 3]) {
^
3 │ console.log(a);
4 │ }

Safe fix: Use const instead.

1 1 // a is redefined (not reassigned) on each loop step.
2 - for·(let·a·in·[1,·2,·3])·{
2+ for·(const·a·in·[1,·2,·3])·{
3 3 console.log(a);
4 4 }

let a;
a = 0;
code-block.js:1:1 lint/style/useConst ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

This let declares a variable that is only assigned once.

> 1 │ let a;
^^^
2 │ a = 0;
3 │

‘a’ is only assigned here.

1 │ let a;
> 2 │ a = 0;
^
3 │

let a = 3;
{
let a = 4;
a = 2;
}
code-block.js:1:1 lint/style/useConst  FIXABLE  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

This let declares a variable that is only assigned once.

> 1 │ let a = 3;
^^^
2 │ {
3 │ let a = 4;

‘a’ is never reassigned.

> 1 │ let a = 3;
^
2 │ {
3 │ let a = 4;

Safe fix: Use const instead.

1 - let·a·=·3;
1+ const·a·=·3;
2 2 {
3 3 let a = 4;

let a = 2;
a = 3;
console.log(a);
let a = 1, b = 2;
b = 3;
let a;
a; // the variable is read before its assignment
a = 0;

Since v2.2, the rule no longer reports variables that are read in an inner function before being written. This can result in false negatives. For example, the following code is now valid:

let a;
function f() {
return a; // read
}
a = 0; // written
biome.json
{
"linter": {
"rules": {
"style": {
"useConst": "error"
}
}
}
}