打字稿切换语句执行错误大小写?



如果有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;
}
}

最新更新