无法重新声明块作用域变量,即使它们位于不同的情况下

Nic*_*ick 2 node.js sequelize.js visual-studio-code

在控制器方法内部,我有下面的代码块。Visual Studio Code 给出错误:

无法重新声明块范围变量“count”和“rows”

但我不明白这一点,因为这些变量是在不同的情况下声明的,并且只有 1 个情况会触发。我应该如何处理这个问题?

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,
        });
        ...
Run Code Online (Sandbox Code Playgroud)

ero*_*ico 5

默认情况下,switch 语句没有不同的作用域,事实上,如果您不在breaka 末尾使用关键字,case脚本将执行所有情况下的所有代码,直到找到中断或switch语句结束。

例如:

switch(1) {
    case 1:
        console.log('case 1');
    case 2:
        console.log('case 2');
}
// OUTPUT:
// case 1
// case 2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,所有案例都被执行,因为我没有使用任何break.

交换机的唯一范围是交换机本身,那么如何才能实现您的目标呢?

您可以通过将案例括在括号内来完成此操作,因此它将变为:

switch(1) {
    case 1: {
        const n = 1
        console.log('case ' + n)
        break
    }
    case 2: {
        const n = 2
        console.log('case ' + n)
        break
    }
}
// That's valid
Run Code Online (Sandbox Code Playgroud)

如果您不想复制代码只是为了编辑查询,您可能会执行以下操作:

const query = { /* whatever */ }

const { count, rows } = await User.findAndCountAll({
    where: tab === 'active' ? {
        ...query,
    } : {
        ...query,
        [Op.or]: [{ name: {[Op.like]: `%${searchText}%` }}]
    },
    offset,
    limit,
})
Run Code Online (Sandbox Code Playgroud)

通过使用三元运算符,您甚至不必实现开关并复制代码,您只需根据变量更改查询部分