自
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;
}
3条答案
按热度按时间nr9pn0ug1#
使用JS switch语句是不可能的。在JS和TS扩展中,switch语句以非常直接的方式操作:
所以你看到的行为部分是由这两个动作引起的。首先要理解的是,使用逗号是不起作用的,因为它被解释为使用comma operator的表达式,正如你所注意到的,它只会导致最后逗号表达式的值。
对于第二次尝试,它将命中默认表达式,因为在严格比较下,两个对象只有在它们是相同引用时才相等。因此,在开关中使用数组文字将产生一个新的数组对象(引用),它永远不会等于每种情况下由文字创建的 * 不同 * 引用。
为了得到你想要的行为,你必须用传统的方法来做比较:手动使用
if
语句的集合。这将允许您单独比较元组中的每一项。可能类似于:7gcisfzg2#
我不确定这是否是你要找的,但也许你可以用它作为一个变通办法
xwmevbvl3#
虽然这在JS和TS中是不可能的,但为了避免if/else混乱,我使用了以下基于比较的方法:
链接到example
您也可以将cmp(conditionObj)函数的方法更改为cmp(condition(obj))-通过lambda的条件,或者在没有函数的case语句中直接使用条件。