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
相关产品推荐
相关产品推荐

