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



由于

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

不起作用(据我所知,只在逗号的右边(,我想知道是否有一个相当于铁锈匹配的字体:

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;
}

使用JS switch语句是不可能的。在JS和TS中,switch语句以一种非常简单的方式运行:

  • 评估开关中的表达式
  • (严格地(将它与每个案例进行比较

所以你看到的行为在一定程度上是由这两种行为引起的。首先要理解的是,使用逗号不起作用,因为它被解释为使用逗号运算符的表达式,正如您所注意到的,这只会导致最终逗号表达式的值。

对于第二次尝试,它将命中默认表达式,因为在严格比较下,只有当两个对象是相同的引用时,它们才相等。因此,在开关中使用数组文字会生成一个新的数组对象(引用(,该对象永远不会等于文字在每种情况下创建的不同引用。

为了获得您想要的行为,您必须以老式的方式进行比较:手动使用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")
}

不确定这是否是您想要的,但也许您可以将其用作的变通方法

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"
}

虽然这在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;
}
}

链接到示例

您还可以通过lamda将带有cmp(conditionObj(函数的方法更改为cmp(condition(obj((-condition,或者在不带函数的case语句中直接使用condition。

相关内容

最新更新