如何解决如何使用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);
}
}
,
正确的答案是完全不用担心这一点。
即使使用该switch语句,您的reducer也会被其他动作调用。因此,试图限制一组确切的动作并没有帮助。
更好的方法是使用our official Redux Toolkit package中的createSlice
API,并让它定义您希望在特定切片中处理的操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。