diff --git a/src/applyMiddleware.ts b/src/applyMiddleware.ts index f735843252..4ac6984c5a 100644 --- a/src/applyMiddleware.ts +++ b/src/applyMiddleware.ts @@ -1,8 +1,10 @@ import compose from './compose' import { Middleware, MiddlewareAPI } from './types/middleware' -import { AnyAction } from './types/actions' -import { StoreEnhancer, StoreCreator, Dispatch } from './types/store' -import { Reducer } from './types/reducers' +import { + Dispatch, + StoreEnhancer, + StoreEnhancerStoreCreator +} from './types/store' /** * Creates a store enhancer that applies middleware to the dispatch method @@ -23,40 +25,17 @@ import { Reducer } from './types/reducers' * @template Ext Dispatch signature added by a middleware. * @template S The type of the state supported by a middleware. */ -export default function applyMiddleware(): StoreEnhancer -export default function applyMiddleware( - middleware1: Middleware -): StoreEnhancer<{ dispatch: Ext1 }> -export default function applyMiddleware( - middleware1: Middleware, - middleware2: Middleware -): StoreEnhancer<{ dispatch: Ext1 & Ext2 }> -export default function applyMiddleware( - middleware1: Middleware, - middleware2: Middleware, - middleware3: Middleware -): StoreEnhancer<{ dispatch: Ext1 & Ext2 & Ext3 }> -export default function applyMiddleware( - middleware1: Middleware, - middleware2: Middleware, - middleware3: Middleware, - middleware4: Middleware -): StoreEnhancer<{ dispatch: Ext1 & Ext2 & Ext3 & Ext4 }> -export default function applyMiddleware( - middleware1: Middleware, - middleware2: Middleware, - middleware3: Middleware, - middleware4: Middleware, - middleware5: Middleware -): StoreEnhancer<{ dispatch: Ext1 & Ext2 & Ext3 & Ext4 & Ext5 }> -export default function applyMiddleware( - ...middlewares: Middleware[] -): StoreEnhancer<{ dispatch: Ext }> -export default function applyMiddleware( - ...middlewares: Middleware[] -): StoreEnhancer { - return (createStore: StoreCreator) => ( - reducer: Reducer, +export default function applyMiddleware< + S = any, + M extends Middleware = Middleware +>( + ...middlewares: M[] +): StoreEnhancer< + M extends Middleware ? { dispatch: D } : never, + S +> { + return (createStore: StoreEnhancerStoreCreator) => ( + reducer, ...args: any[] ) => { const store = createStore(reducer, ...args)