From 0e7cc3ff0cb0a17e5b91dc012534adcca8f47c29 Mon Sep 17 00:00:00 2001 From: Paul Morelle Date: Thu, 13 Sep 2018 11:27:02 -0400 Subject: [PATCH] redux-promise-middleware: fix Dispatch return type When the payload is a Promise, the Promise Middleware will change what `dispatch()` returns. Reflect this with typing. According to documentation [1], it is a Promise of an object with the promised `value` and the FULFILLED action `type`. [1] https://github.com/pburtchaell/redux-promise-middleware/blob/master/docs/guides/chaining-actions.md --- types/redux-promise-middleware/index.d.ts | 16 ++++++++++++++++ .../redux-promise-middleware-tests.ts | 3 ++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/types/redux-promise-middleware/index.d.ts b/types/redux-promise-middleware/index.d.ts index 70eea32baa..52d41541cb 100644 --- a/types/redux-promise-middleware/index.d.ts +++ b/types/redux-promise-middleware/index.d.ts @@ -2,7 +2,23 @@ // Project: https://github.com/pburtchaell/redux-promise-middleware // Definitions by: ianks // Definitions: https://github.com/borisyankov/DefinitelyTyped +// TypeScript Version: 2.8 import { Middleware } from 'redux'; export default function promiseMiddleware(config?: { promiseTypeSuffixes?: string[], promiseTypeDelimiter?: string }): Middleware; + +declare module "redux" { + export interface PromiseAction extends Action { + payload: Promise; + } + + type PayloadType = PA extends PromiseAction ? R : never; + + export interface Dispatch { + >(action: PA): Promise<{ + value: PayloadType; + type: string; + }>; + } +} diff --git a/types/redux-promise-middleware/redux-promise-middleware-tests.ts b/types/redux-promise-middleware/redux-promise-middleware-tests.ts index 788a3faee3..eb9cc00603 100644 --- a/types/redux-promise-middleware/redux-promise-middleware-tests.ts +++ b/types/redux-promise-middleware/redux-promise-middleware-tests.ts @@ -2,7 +2,6 @@ import { createStore, applyMiddleware, Store, Dispatch } from "redux"; import promiseMiddleware from "redux-promise-middleware"; declare var rootReducer: (state: any, action: any) => any; -declare var Promise: any; declare var doSomethingAsyncAndReturnPromise: any; declare var someActionCreator: any; @@ -38,6 +37,8 @@ const actionCreator2 = () => ({ promise: Promise.resolve((action: string, dispatch: Dispatch, getState: Function) => { dispatch({ type: "SECEOND_ACTION_TYPE", payload: "..." }); dispatch(someActionCreator()); + dispatch({ type: "CHAINED_ACTION", payload: Promise.resolve("...") }) + .then(({ type, value }) => {}) }) } });