2

我试图找到一个明确的答案这样做,但还没有找到一个。

SO上有一个问题可以回答如何实施详尽的switch陈述:

如何检查 TypeScript 中的 switch 块是否详尽?

答案是:

编写一个函数,never作为参数,返回never并在调用任何东西时抛出。

function assertUnreachable(x: never): never {
  throw new Error("Didn't expect to get here");
}

并在您的default情况下使用它:

switch (action.type) {
  case "A": {
    ...
  }
  case "B": {
    ...
  }
  default: {
    return assertUnreachable(action);  // CAN'T USE action.type HERE BECAUSE action WILL BE never AND action.type WILL BE any
  }
}

但我不能在reducer. 它可以检查我的 reducer 操作的详尽性,但会在运行时抛出,因为 Redux 会使用自己的内部操作调用它,例如:

@@redux/INITh.b.0.x.q.h                   // THIS IS THE action.type
@@redux/PROBE_UNKNOWN_ACTIONe.7.b.o.p     // THIS IS THE action.type

那么switch在 reducer 中处理详尽的语句的理想方法是什么?

4

2 回答 2

3

这里的正确答案是完全不用担心这个。

即使使用该 switch 语句,您的 reducer 也会被其他操作调用。因此,试图限制确切的操作集并没有真正的帮助。

更好的方法是使用我们官方 Redux Toolkit 包createSlice中的API ,并让它定义您希望在该特定切片中处理的操作。

于 2020-09-15T15:17:23.320 回答
2

我在Note on TypeScript 在 Redux 的 reducer 范围内的详尽类型检查中找到了一个简洁的解决方案。解决方案是:

  • 在编译时触发错误
  • 不要在运行时抛出错误
function endReducer<T>(state: T, action: never): T {
    return state;
}

function reducer(state: State, action: Actions) {
    switch (action.type) {
        case ...

        default:
            return endReducer(state, action);
    }
}

游乐场链接

于 2020-09-15T11:53:41.580 回答