如何使用Redux Promise Middleware处理调度的返回类型?

时间:2018-07-26 17:18:01

标签: typescript redux redux-promise-middleware

Redux Promise中间件似乎可以处理动作有效载荷的承诺解析。例如,考虑使用Promise作为有效负载的动作创建者:

export default class ActionCreators {
  public static fetchAllUsers(): FetchAction {
    return {
      type: actionTypes.FETCH_ALL_USERS,
      payload: fetch("api.com/users")
    };
  }
}

使用此动作创建器时,TypeScript期望返回Action的数据,而不是由于redux-promise-middleware而实际返回的Promise

因此,以下代码将无法编译,因为Property 'then' does not exist on type 'Action'.

dispatch(ActionCreators.fetchAllUsers())
    .then(response => {
        // do something with response
    })

Typescript期望返回诸如payloadtype之类的属性,实际上不会返回这些属性,因为Promise已经被处理并且实际上已经被返回。

.then可以使用了,但是打字稿因为需要其他东西而无法编译。

我想问题是:如何编写正确的类型来处理redux-promise-middleware动作,同时为redux的connect-函数提供mapDispatchToProps等的正确分派类型。

1 个答案:

答案 0 :(得分:0)

您可以使用条件类型。 例如

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

}