You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

switch不同case中声明同名块级变量报重复声明错误如何解决

报错原因

switch语句的所有case分支默认共享同一个块级作用域,并不会为每个单独的case创建独立作用域。
const/let的重复声明校验是代码解析阶段执行的语法检查,和运行时实际命中哪个分支无关:解析器扫描到switch的大括号范围内有两个同名的count、rows块级变量声明,就会直接抛出 Cannot redeclare block-scoped variable 'count' and 'rows' 错误,不会等到代码运行阶段再判断分支逻辑。

解决方案

优先推荐改动最小、作用域最清晰的方案:给每个case分支包裹独立的大括号,创建单独的块级作用域,让分支内声明的变量仅在当前分支块内生效。
修正后的代码示例:

switch (tab) {
    case "active": {
        const { count, rows } = await User.findAndCountAll({
            where: {
                ...query,
            },
            offset,
            limit,
        });

        break;
    }

    case "favourites": {
        const { count, rows } = await User.findAndCountAll({
            where: {
                ...query,
                [Op.or]: [{ name: {[Op.like]: `%${searchText}%` }}],
            },
            offset,
            limit,
        });
        // 其余分支逻辑
        break;
    }
}

如果后续逻辑需要在switch外部访问count和rows,也可以选择把变量声明提到switch外部,分支内仅做赋值操作:

let count, rows;
switch (tab) {
    case "active":
        const activeResult = await User.findAndCountAll({
            where: {
                ...query,
            },
            offset,
            limit,
        });
        count = activeResult.count;
        rows = activeResult.rows;
        break;

    case "favourites":
        const favResult = await User.findAndCountAll({
            where: {
                ...query,
                [Op.or]: [{ name: {[Op.like]: `%${searchText}%` }}],
            },
            offset,
            limit,
        });
        count = favResult.count;
        rows = favResult.rows;
        break;
}

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:18:16