Как обработать возвратный тип отправки с Redux Promise Middleware?

Redux Promise Middleware, кажется, обрабатывает обещание разрешения полезной нагрузки действия. Например, рассмотрим этот создатель действий, который использует Promise в качестве полезной нагрузки:

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

При использовании этого создателя действий TypeScript ожидает Action возвращенные данные, а не Promise это на самом деле возвращается из-за избыточного промежуточного программного обеспечения.

Таким образом, следующий код не будет компилироваться, потому что Property 'then' does not exist on type 'Action'.

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

Typescript ожидает возвращаемые свойства, такие как payload а также type, которые на самом деле не возвращаются, потому что обещание уже выполнено и действительно возвращено.

.then готов к использованию, но машинопись не скомпилируется, потому что ожидает чего-то другого.

Я предполагаю, что вопрос заключается в следующем: как написать правильную типизацию для обработки действий избыточности-обещания-промежуточного программного обеспечения, обеспечивая при этом избыточность connect-функция с правильными типами отправки для mapDispatchToProps и т.п.

1 ответ

Вы можете использовать условные типы. Например

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

}

Другие вопросы по тегам