|
1 | 1 | import { Middleware, GetState, Dispatch, Reducer, Store } from '../types'; |
2 | 2 |
|
3 | | -export interface ThunkMiddleware<State, ExtraArgument> extends Middleware<State> { |
4 | | - withExtraArgument: (extraArgument: ExtraArgument) => ThunkMiddleware<State, ExtraArgument>; |
| 3 | +export interface ThunkMiddleware<State, ExtraArgument> |
| 4 | + extends Middleware<State, Reducer<State>, Thunk<State, ExtraArgument, any>> { |
| 5 | + withExtraArgument: <EA>(extraArgument: EA) => ThunkMiddleware<State, EA>; |
5 | 6 | } |
6 | 7 |
|
7 | | -export interface Delegate<State, ExtraArgument, T> { |
8 | | - (dispatch: ThunkDispatch<State, ExtraArgument>, getState: GetState<State>, extraArgument: ExtraArgument): T; |
| 8 | +export interface Delegate<State, ExtraArgument, Return> { |
| 9 | + (dispatch: ThunkDispatch<State, ExtraArgument>, getState: GetState<State>, extraArgument: ExtraArgument): Return; |
9 | 10 | } |
10 | 11 |
|
11 | 12 | export interface ThunkDispatch<State, ExtraArgument> extends Dispatch<Reducer<State>> { |
12 | | - <T>(reducer: Thunk<State, ExtraArgument, T>): T; |
| 13 | + <Return>(reducer: Thunk<State, ExtraArgument, Return>): Return; |
13 | 14 | } |
14 | 15 |
|
15 | | -export interface Thunk<State, ExtraArgument, T> { |
16 | | - (state: State): Delegate<State, ExtraArgument, T>; |
| 16 | +export interface Thunk<State, ExtraArgument, Return> { |
| 17 | + (state: State): Delegate<State, ExtraArgument, Return>; |
17 | 18 | } |
18 | 19 |
|
19 | | -function thunkFactory<T>(extraArgument?: T): ThunkMiddleware<any, T> { |
20 | | - const thunk = ((store, reducer) => { |
| 20 | +const thunkFactory = (extraArgument?) => { |
| 21 | + const thunk = store => next => reducer => { |
| 22 | + if (typeof reducer !== 'function') throw new Error('Thunk requires reducers as functions'); |
21 | 23 | const state = store.getState(); |
22 | 24 | const result = reducer(state); |
23 | | - return typeof result === 'function' ? result(store.dispatch, store.getState, extraArgument) : reducer; |
24 | | - }) as ThunkMiddleware<any, T>; |
25 | | - thunk.withExtraArgument = thunkFactory; |
| 25 | + if (typeof result === 'function') return result(store.dispatch, store.getState, extraArgument); |
| 26 | + else { |
| 27 | + next(_ => result); |
| 28 | + return reducer; |
| 29 | + } |
| 30 | + }; |
| 31 | + thunk['withExtraArgument'] = thunkFactory; |
26 | 32 | return thunk; |
27 | | -} |
| 33 | +}; |
28 | 34 |
|
29 | | -export default thunkFactory(); |
| 35 | +export default thunkFactory() as ThunkMiddleware<any, any>; |
0 commit comments