Typescript switch语句执行错误的情况?

时间:2018-10-02 18:43:35

标签: javascript angular typescript

如果具有Stackblitz: the following typescript switch block并且执行第一种情况,即使过滤器为假(如下面的记录语句所示):

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

这是控制台日志(可以在stackblitz链接中看到):

FILTER VALUE:
false
IS THE FILTER TRUE?
false
Returning complete TODOS

我感觉自己缺少了一些非常简单的东西,但与此同时,这似乎是错误的……想法?

3 个答案:

答案 0 :(得分:4)

这不是您编写开关盒的方式。整个想法是打开一个动态值,然后让每种情况处理一个静态值。

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

答案 1 :(得分:1)

切换的想法是使用switch(someValue)中的值并在每种情况下进行检查,但是您需要手动进行每种情况检查。

如果您希望保留这种方式,请在switch(true)

中输入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");
}

答案 2 :(得分:0)

Refer开关盒的工作原理:

它是这样工作的:

switch表达式只计算一次。 将表达式的值与每种情况的值进行比较。 如果匹配,则执行相关的代码块。

您的案例 filter == 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;
    }
  }