// https://github.com/pburtchaell/redux-promise-middleware/issues/253 import { AsyncAction as OrigAsyncAction } from 'redux-promise-middleware'; // ----------------------------------- // redux-promise-middleware extension // ----------------------------------- declare type AsyncFunction = () => Promise; declare type AsyncPayload = | Promise | AsyncFunction | { promise: Promise | AsyncFunction; data?: any; }; export declare interface AsyncAction extends OrigAsyncAction { payload: AsyncPayload; } type AsyncActionResult = A extends AsyncAction ? R : never; export type AsyncFulfilledAction< A extends AsyncAction, Type extends string = string > = Omit & { type: Type; payload: AsyncActionResult; }; type FulfilledDispatchResult = { action: AsyncFulfilledAction; value: AsyncActionResult; }; export type AsyncDispatchReturns = T extends AsyncAction ? Promise> : T; // ---------------------- // redux-thunk extension // ---------------------- export type ThunkDispatchReturns = A extends ThunkAction ? R : A; export interface ThunkDispatch { (action: A): AsyncDispatchReturns>; } export declare type ThunkAction = ( dispatch: ThunkDispatch, getState: () => S, extraArgument: E, ) => R;