如果有Stackblitz:以下打字稿切换块,它执行第一种情况,即使过滤器为假(如下面的日志记录语句所示(:
public applyFilter(filter, completeTodos, incompleteTodos): Todo[] {
console.log("FILTER VALUE: ", filter);
console.log("IS THE FILTER TRUE?", filter == true);
switch (filter) {
case filter == true:
console.log("Returning complete TODOS");
return completeTodos;
break;
case filter == false:
console.log("Returning incomplete TODOS");
return incompleteTodos;
break;
default:
console.log("Returning the Default");
return completeTodos;
}
}
这是控制台记录的内容(可以在堆栈闪电链接中看到(:
FILTER VALUE:
false
IS THE FILTER TRUE?
false
Returning complete TODOS
我有一种感觉,我错过了一些非常简单的东西,但与此同时,这似乎不对......思潮?
这不是你写开关案例的方式。整个想法是打开一个动态值,然后让每个案例处理一个静态值。
switch (filter) {
case true:
console.log("Returning complete TODOS");
return completeTodos;
case false:
console.log("Returning incomplete TODOS");
return incompleteTodos;
default:
console.log("Returning the Default");
return completeTodos;
}
break
语句也是多余的,因为您在它们之前返回。如果要在切换块后继续执行,则只需要break
。
此外,您的默认情况有点没有意义,因为布尔值要么为真,要么为假,除非您打算在某些情况下通过undefined
。
开关的想法是使用switch(someValue)
中的值并在每种情况下检查它,但您手动执行每个案例检查。
如果你想保持这种方式,那就在switch(true)
const filter = false;
switch (true) {
case filter == true:
console.log("Returning complete TODOS");
break;
case filter == false:
console.log("Returning incomplete TODOS");
break;
default:
console.log("Returning the Default");
}
否则,请使用 switch 语句,如下所示:
const filter = false;
switch (filter) {
case true:
console.log("Returning complete TODOS");
break;
case false:
console.log("Returning incomplete TODOS");
break;
default:
console.log("Returning the Default");
}
参考开关大小写的工作原理:
这是它的工作原理:
开关表达式计算一次。 将表达式的值与每个事例的值进行比较。 如果存在匹配项,则执行关联的代码块。
您的案例过滤器 == true返回false
像这样更改代码:
public applyFilter(filter, completeTodos, incompleteTodos): Todo[] {
console.log("FILTER VALUE: ", filter);
console.log("IS THE FILTER TRUE?", filter == true);
switch (filter) {
case true:
console.log("Returning complete TODOS");
return completeTodos;
break;
case false:
console.log("Returning incomplete TODOS");
return incompleteTodos;
break;
default:
console.log("Returning the Default");
return completeTodos;
}
}