typescript - Redux Promise Middleware 如何处理 dispatch 的返回类型?
问题描述
Redux Promise Middleware 似乎处理了动作负载的承诺解析。例如,考虑这个使用 aPromise
作为有效负载的动作创建者:
export default class ActionCreators {
public static fetchAllUsers(): FetchAction {
return {
type: actionTypes.FETCH_ALL_USERS,
payload: fetch("api.com/users")
};
}
}
当使用这个动作创建器时,TypeScript 期望Action
返回的数据,而不是Promise
由于 redux-promise-middleware 而实际返回的数据。
所以下面的代码不会编译,因为Property 'then' does not exist on type 'Action'.
dispatch(ActionCreators.fetchAllUsers())
.then(response => {
// do something with response
})
Typescript 期望返回的属性如payload
and type
,实际上并没有返回,因为 promise 已经被处理并且实际上已经被返回。
.then
已准备好使用,但 typescript 不会编译,因为它需要其他东西。
我想问题是:如何编写正确的类型来处理 redux-promise-middleware 操作,同时为 redux' connect
-function 提供正确的调度类型mapDispatchToProps
等。
解决方案
您可以使用条件类型。例如
export interface BaseAction<TPayload> {
type: string;
payload: TPayload;
}
export interface Dispatch {
<T extends BaseAction<any>>(action: T):
T extends BaseAction<Promise<infer R>> ? Promise<R>: T
}
推荐阅读
- python - 来自拆分 str 的字典理解
- laravel - 如何启动并运行 azure ad auth?
- common-lisp - 使用带有 parenscript 和 sigil 的 quicklisp
- xamarin.forms - bindableProperty 无法获取值?
- c++ - 1-10的中序二叉搜索树遍历
- python - 如何通过反向按箭头键来阻止蛇进入自身
- angular - 是否可以找出 ANGULAR 2+ 项目何时构建在组件中?
- c# - 如何在 web.config C# 中设置回收应用程序池设置
- ios - 如何在 Nativescript IOS Webview 上更改用户代理或设置为桌面模式
- python - 如何在python中的任何变量中申请循环