From c457dd94ee5b69e4776a247a660729a16c5c6682 Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Thu, 29 Aug 2019 13:26:40 -0400 Subject: [PATCH 1/2] convert applyMiddleware.js to typescript --- ...{applyMiddleware.js => applyMiddleware.ts} | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) rename src/{applyMiddleware.js => applyMiddleware.ts} (72%) diff --git a/src/applyMiddleware.js b/src/applyMiddleware.ts similarity index 72% rename from src/applyMiddleware.js rename to src/applyMiddleware.ts index 3bfc647b45..3837181241 100644 --- a/src/applyMiddleware.js +++ b/src/applyMiddleware.ts @@ -1,4 +1,11 @@ import compose from './compose' +import { + Middleware, + StoreEnhancer, + StoreCreator, + Dispatch, + AnyAction +} from '..' /** * Creates a store enhancer that applies middleware to the dispatch method @@ -16,10 +23,12 @@ import compose from './compose' * @param {...Function} middlewares The middleware chain to be applied. * @returns {Function} A store enhancer applying the middleware. */ -export default function applyMiddleware(...middlewares) { - return createStore => (...args) => { - const store = createStore(...args) - let dispatch = () => { +export default function applyMiddleware( + ...middlewares: Middleware[] +): StoreEnhancer { + return (createStore: StoreCreator) => (reducer: any, ...args) => { + const store = createStore(reducer, ...args) + let dispatch: Dispatch = () => { throw new Error( 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.' @@ -28,7 +37,8 @@ export default function applyMiddleware(...middlewares) { const middlewareAPI = { getState: store.getState, - dispatch: (...args) => dispatch(...args) + dispatch: (action: AnyAction, ...args: any[]) => + (dispatch as any)(action, ...args) } const chain = middlewares.map(middleware => middleware(middlewareAPI)) dispatch = compose(...chain)(store.dispatch) From b8f113bbb854a4d1e2c59bd8b31d05fd31019ad6 Mon Sep 17 00:00:00 2001 From: Gregory Beaver Date: Thu, 29 Aug 2019 13:45:38 -0400 Subject: [PATCH 2/2] vastly improve the definition of middleware types --- index.d.ts | 2 +- src/applyMiddleware.ts | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/index.d.ts b/index.d.ts index d31a15ffea..db64dd5e3c 100644 --- a/index.d.ts +++ b/index.d.ts @@ -211,7 +211,7 @@ export function combineReducers>( * dispatched. */ export interface Dispatch { - (action: T): T + (action: T, ...extraArgs: any[]): T } /** diff --git a/src/applyMiddleware.ts b/src/applyMiddleware.ts index 3837181241..68e698e8f0 100644 --- a/src/applyMiddleware.ts +++ b/src/applyMiddleware.ts @@ -3,8 +3,10 @@ import { Middleware, StoreEnhancer, StoreCreator, + AnyAction, + Reducer, Dispatch, - AnyAction + MiddlewareAPI } from '..' /** @@ -26,7 +28,10 @@ import { export default function applyMiddleware( ...middlewares: Middleware[] ): StoreEnhancer { - return (createStore: StoreCreator) => (reducer: any, ...args) => { + return (createStore: StoreCreator) => ( + reducer: Reducer, + ...args: any[] + ) => { const store = createStore(reducer, ...args) let dispatch: Dispatch = () => { throw new Error( @@ -35,10 +40,9 @@ export default function applyMiddleware( ) } - const middlewareAPI = { + const middlewareAPI: MiddlewareAPI = { getState: store.getState, - dispatch: (action: AnyAction, ...args: any[]) => - (dispatch as any)(action, ...args) + dispatch: (action, ...args) => dispatch(action, ...args) } const chain = middlewares.map(middleware => middleware(middlewareAPI)) dispatch = compose(...chain)(store.dispatch)