Skip to content

Commit e0ebe01

Browse files
author
Péter Hauszknecht
committed
update dispatch signature
1 parent de951ab commit e0ebe01

4 files changed

Lines changed: 21 additions & 20 deletions

File tree

src/store/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ export default class Store<State, R = Reducer<State>> implements IStore<State, R
1717

1818
getState: GetState<State> = () => this.state;
1919

20-
dispatch: Dispatch<R> = reducer => {
20+
dispatch: Dispatch<R, State> = reducer => {
2121
if (typeof reducer !== 'function')
2222
throw new Error('Reducer is not a function: dispatch takes only reducers as functions.');
2323
this.state = reducer(this.state);
2424
this.listeners.forEach(listener => listener());
25-
return <R>reducer;
25+
return this.state;
2626
};
2727

2828
subscribe = (listener: Listener): Unsubscribe => {

src/store/middlewares/thunk.ts

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
import { Middleware, GetState, Dispatch, Reducer, Store } from '../types';
22

33
export interface ThunkMiddleware<State, ExtraArgument>
4-
extends Middleware<State, Reducer<State>, Thunk<State, ExtraArgument, any>> {
4+
extends Middleware<State, Reducer<State>, Thunk<State, ExtraArgument>> {
5+
(store: Store<State, Reducer<State> | Delegate<State, ExtraArgument>>): {
6+
(next: Dispatch<Reducer<State>, State>): Dispatch<Delegate<State, ExtraArgument>>;
7+
};
58
withExtraArgument: <EA>(extraArgument: EA) => ThunkMiddleware<State, EA>;
69
}
710

8-
export interface Delegate<State, ExtraArgument, Return> {
11+
export interface Delegate<State, ExtraArgument, Return = any> {
912
(dispatch: ThunkDispatch<State, ExtraArgument>, getState: GetState<State>, extraArgument: ExtraArgument): Return;
1013
}
1114

12-
export interface ThunkDispatch<State, ExtraArgument> extends Dispatch<Reducer<State>> {
13-
<Return>(reducer: Thunk<State, ExtraArgument, Return>): Return;
15+
export interface Thunk<State, ExtraArgument, Return = any> {
16+
(state: State): Delegate<State, ExtraArgument, Return>;
1417
}
1518

16-
export interface Thunk<State, ExtraArgument, Return> {
17-
(state: State): Delegate<State, ExtraArgument, Return>;
19+
export interface ThunkDispatch<State, ExtraArgument> extends Dispatch<Reducer<State>, State> {
20+
<Return>(thunk: Thunk<State, ExtraArgument, Return>): Return;
1821
}
1922

20-
const thunkFactory = (extraArgument?) => {
21-
const thunk = store => next => reducer => {
23+
const thunkFactory = <State, ExtraArgument>(extraArgument?: ExtraArgument) => {
24+
const thunk = (store => next => reducer => {
2225
if (typeof reducer !== 'function') throw new Error('Thunk requires reducers as functions');
2326
const state = store.getState();
2427
const result = reducer(state);
@@ -27,8 +30,8 @@ const thunkFactory = (extraArgument?) => {
2730
next(_ => result);
2831
return reducer;
2932
}
30-
};
31-
thunk['withExtraArgument'] = thunkFactory;
33+
}) as ThunkMiddleware<State, ExtraArgument>;
34+
thunk.withExtraArgument = thunkFactory;
3235
return thunk;
3336
};
3437

src/store/types.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ export interface Reducer<State> {
66
(state: State): State;
77
}
88

9-
export interface Dispatch<Reducer> {
10-
(reducer: Reducer): Reducer;
9+
export interface Dispatch<Reducer, State = any> {
10+
(reducer: Reducer): State;
1111
}
1212

1313
export interface Listener {
@@ -20,15 +20,13 @@ export interface Unsubscribe {
2020

2121
export interface Middleware<State, R1, R2> {
2222
(store: Store<State, R1>): {
23-
(next: Dispatch<R1>): {
24-
(reducer: R2): any;
25-
};
23+
(next: Dispatch<R1, State>): Dispatch<R2>;
2624
};
2725
}
2826

2927
export interface Store<State, R = Reducer<State>> {
3028
getState: GetState<State>;
31-
dispatch: Dispatch<R>;
29+
dispatch: Dispatch<R, State>;
3230
subscribe(listener: Listener): Unsubscribe;
3331
addMiddleware<R2>(...middlewares: Middleware<State, R, R2>[]): Store<State, R | R2>;
3432
}

src/test/store.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ describe('store', () => {
3636
assert.strictEqual(store.getState(), 2);
3737
});
3838

39-
it('dispatch returns the reducer', () => {
39+
it('dispatch returns the new state', () => {
4040
const store = new Store(1);
4141
const reducer = state => state + 1;
42-
assert.strictEqual(store.dispatch(reducer), reducer);
42+
assert.strictEqual(store.dispatch(reducer), 2);
4343
});
4444
});
4545

0 commit comments

Comments
 (0)