微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Typescript在Redux reducer函数中实现详尽的switch语句?如何处理Redux的内部@@ redux操作

如何解决如何使用Typescript在Redux reducer函数中实现详尽的switch语句?如何处理Redux的内部@@ redux操作

我试图找到一个确定的答案,但是还没有找到答案。

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

How do I check that a switch block is exhaustive in TypeScript?

答案是:

编写一个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语句穷举性的理想方法是什么?

解决方法

我在Note on TypeScript's exhaustive type checks in scope of Redux's 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);
    }
}

Playground link

,

正确的答案是完全不用担心这一点。

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

更好的方法是使用our official Redux Toolkit package中的createSlice API,并让它定义您希望在特定切片中处理的操作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。