等价于typescript switch语句中的多个表达式

3qpi33ja  于 2022-12-14  发布在  TypeScript
关注(0)|答案(3)|浏览(243)

switch(1 === 1, 2 === 2) {
    case true, true:
        console.log("true, true");
        break;
    default:
        console.log("default");
        break;
}

不起作用(据我所知,只会偏离逗号的右边),我想知道是否有一个 typescript 相当于类似 rust 的火柴:

match(1 == 1, 2 == 2) {
    (true, true) => println!("true, true"),
    _ => println!("default"),
}

我尝试过用元组做一些事情,但它总是进入默认条件,见下面的代码。

switch([1 === 1, 2 === 2]) {
    case [true, true]:
        console.log("true, true");
        break;
    default:
        console.log("default");
        break;
}
nr9pn0ug

nr9pn0ug1#

使用JS switch语句是不可能的。在JS和TS扩展中,switch语句以非常直接的方式操作:

  • 评估参数中的运算式。
  • 把它(严格地)与每一个事例进行比较。

所以你看到的行为部分是由这两个动作引起的。首先要理解的是,使用逗号是不起作用的,因为它被解释为使用comma operator的表达式,正如你所注意到的,它只会导致最后逗号表达式的值。
对于第二次尝试,它将命中默认表达式,因为在严格比较下,两个对象只有在它们是相同引用时才相等。因此,在开关中使用数组文字将产生一个新的数组对象(引用),它永远不会等于每种情况下由文字创建的 * 不同 * 引用。
为了得到你想要的行为,你必须用传统的方法来做比较:手动使用if语句的集合。这将允许您单独比较元组中的每一项。可能类似于:

function compareTuples(tup1, tup2) {
  if (tup1.length !== tup2.length) return false;
  return tup1.every((value, index) => tup2[index] === value);
}

const base_tuple = [1 === 1, 2 === 2]

if (compareTuples(base_tuple, [true, true])) {
  console.log("Matched [true, true]")
} else if (compareTuples(base_tuple, [true, false])) {
  console.log("Matched [true, false]")
} else {
  console.log("Matched default")
}
7gcisfzg

7gcisfzg2#

我不确定这是否是你要找的,但也许你可以用它作为一个变通办法

const tuple: [number, number] = [3, 3]

switch (tuple.join(",")) {
    case "3,3": 
      console.log('1');
      break;
    case "3,4":
      console.log('2');
      break;
    default: throw "invalid"
}
xwmevbvl

xwmevbvl3#

虽然这在JS和TS中是不可能的,但为了避免if/else混乱,我使用了以下基于比较的方法:

const obj = {
    color: "red",
    size: 7,
    used: false,
};

const cmp = (condition: any): boolean =>
    _.isMatch(obj, condition);

switch (true) {
    case cmp({ size: 7, color: "red" }): {
        console.log("red 7");
        break;
    }
    case cmp({ used: true }): {
        console.log("used one");
        break;
    }
    default: {
        console.log("default one");
        break;
    }
}

链接到example
您也可以将cmp(conditionObj)函数的方法更改为cmp(condition(obj))-通过lambda的条件,或者在没有函数的case语句中直接使用条件。

相关问题