Why is this an issue?

The ECMAScript specification allows for creating block-level lexical declarations (let, const, function, and class) in any block statement or expression. However, when these declarations are made inside the case or default clause of a switch statement, they are not confined to the block of that case or default clause. Instead, they apply to the whole switch block but only get initialized when the cases are reached, which can lead to unexpected behavior.

switch (foo) {
    case 1:
        let x = 1; // Noncompliant
        break;
    case 2:
        const y = 2; // Noncompliant
        break;
    case 3:
        function f() {} // Noncompliant
        break;
    case 4:
        class C {} // Noncompliant
        break;
}

To fix this, you can create a nested block within each case or default clause, ensuring each declaration is properly scoped to its respective block.

switch (foo) {
    case 1: {
        let x = 1;
        break;
    }
    case 2: {
        const y = 2;
        break;
    }
    case 3: {
        function f() {}
        break;
    }
    case 4: {
        class C {}
        break;
    }
}

Resources

Documentation