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