noSwitchDeclarations
Diagnostic Category: lint/correctness/noSwitchDeclarations
Since: v1.0.0
Sources:
- Same as:
no-case-declarations
Disallow lexical declarations in switch
clauses.
Lexical declarations in switch
clauses are accessible in the entire switch
.
However, it only gets initialized when it is assigned, which will only happen if the switch
clause where it is defined is reached.
To ensure that the lexical declarations only apply to the current switch
clause wrap your declarations in a block.
Examples
Section titled ExamplesInvalid
Section titled Invalidswitch (foo) { case 0: const x = 1; break; case 2: x; // `x` can be used while it is not initialized break;}
code-block.js:3:9 lint/correctness/noSwitchDeclarations FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✖ Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.
1 │ switch (foo) {
2 │ case 0:
> 3 │ const x = 1;
│ ^^^^^^^^^^^
4 │ break;
5 │ case 2:
ℹ The declaration is defined in this switch clause:
1 │ switch (foo) {
> 2 │ case 0:
│ ^^^^^^^
> 3 │ const x = 1;
> 4 │ break;
│ ^^^^^^
5 │ case 2:
6 │ x; // x
can be used while it is not initialized
ℹ Unsafe fix: Wrap the declaration in a block.
1 1 │ switch (foo) {
2 │ - ····case·0:
2 │ + ····case·0:·{
3 3 │ const x = 1;
4 │ - ········break;
4 │ + ········break;
5 │ + ····}
5 6 │ case 2:
6 7 │ x; // x
can be used while it is not initialized
switch (foo) { case 0: function f() {} break; case 2: f(); // `f` can be called here break;}
code-block.js:3:9 lint/correctness/noSwitchDeclarations FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✖ Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.
1 │ switch (foo) {
2 │ case 0:
> 3 │ function f() {}
│ ^^^^^^^^^^^^^^^
4 │ break;
5 │ case 2:
ℹ The declaration is defined in this switch clause:
1 │ switch (foo) {
> 2 │ case 0:
│ ^^^^^^^
> 3 │ function f() {}
> 4 │ break;
│ ^^^^^^
5 │ case 2:
6 │ f(); // f
can be called here
ℹ Unsafe fix: Wrap the declaration in a block.
1 1 │ switch (foo) {
2 │ - ····case·0:
2 │ + ····case·0:·{
3 3 │ function f() {}
4 │ - ········break;
4 │ + ········break;
5 │ + ····}
5 6 │ case 2:
6 7 │ f(); // f
can be called here
switch (foo) { case 0: class A {} break; default: new A(); // `A` can be instantiated here break;}
code-block.js:3:9 lint/correctness/noSwitchDeclarations FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✖ Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.
1 │ switch (foo) {
2 │ case 0:
> 3 │ class A {}
│ ^^^^^^^^^^
4 │ break;
5 │ default:
ℹ The declaration is defined in this switch clause:
1 │ switch (foo) {
> 2 │ case 0:
│ ^^^^^^^
> 3 │ class A {}
> 4 │ break;
│ ^^^^^^
5 │ default:
6 │ new A(); // A
can be instantiated here
ℹ Unsafe fix: Wrap the declaration in a block.
1 1 │ switch (foo) {
2 │ - ····case·0:
2 │ + ····case·0:·{
3 3 │ class A {}
4 │ - ········break;
4 │ + ········break;
5 │ + ····}
5 6 │ default:
6 7 │ new A(); // A
can be instantiated here
Valid
Section titled Validswitch (foo) { case 0: { const x = 1; break; } case 1: // `x` is not visible here break;}