问题描述
我正在尝试打开枚举,以便运行正确的代码。我制作了一个打字稿游乐场,展示了我正在努力完成的一个小例子。
在提供的示例中,我试图理解为什么 Test1 不会打印“B”。我的期望是,当使用逻辑 OR 时,它会尝试检查任一情况是否为真。不只是第一个。这可能是对某些基本原理的误解吗? Test2 有效,因为我明确说明了这些情况,但 Test1 将是一个更紧凑的版本。
enum EventType {
A = "A",B = "B",C = "C",}
function Test1(type: EventType) {
switch(type) {
case EventType.A || EventType.B:
console.log("Test1",type);
break;
case EventType.C:
console.log("Test1",type);
break;
}
}
function Test2(type: EventType) {
switch(type) {
case EventType.A:
case EventType.B:
console.log("Test2",type);
break;
case EventType.C:
console.log("Test2",type);
break;
}
}
const e = EventType.B;
Test1(e); // Expect "B" to print but does not
Test2(e); // Expect "B" to print and it does
解决方法
因为您希望 EventType.A || EventType.B
的计算结果为真,所以您应该在 true
语句中明确使用 switch
。
enum EventType {
A = "A",B = "B",C = "C",}
function Test1(type: EventType) {
switch(true) {
// you should use next approach if you want to mix boolean end enums
case type === EventType.A || type === EventType.B:
console.log("Test1",type);
break;
case type === EventType.C:
console.log("Test1",type);
break;
}
}
function Test2(type: EventType) {
switch(type) {
case EventType.A:
case EventType.B:
console.log("Test2",type);
break;
case EventType.C:
console.log("Test2",type);
break;
}
}
const e = EventType.B;
Test1(e); // Expect "B" to print and it does it
Test2(e); // Expect "B" to print and it does
像 JS 这样的 TypeScript 没有像 Rust、F#、Reason 等高级模式......
,您的问题在于基本面。您要查找的术语称为fall-through。
要在一个 switch 语句中评估多个 case 以进行失败,您可以编写多个 case,分组为相同的 break。
失败示例
switch(foo) {
case A:
case B:
/* statements for both A and B */
break;
case C:
/* statements for C */
}