1
+
1
2
/**
2
3
* An *action* is a plain object that represents an intention to change the
3
4
* state. Actions are the only way to get data into the store. Any data,
12
13
* Other than `type`, the structure of an action object is really up to you.
13
14
* If you're interested, check out Flux Standard Action for recommendations on
14
15
* how actions should be constructed.
16
+ *
17
+ * @template T the type of the action's `type` tag.
15
18
*/
16
- export interface Action {
17
- type : any ;
19
+ export interface Action < T = any > {
20
+ type : T ;
18
21
}
19
22
20
-
21
23
/* reducers */
22
24
23
25
/**
@@ -41,15 +43,18 @@ export interface Action {
41
43
*
42
44
* *Do not put API calls into reducers.*
43
45
*
44
- * @template S State object type.
46
+ * @template S The type of state consumed and produced by this reducer.
47
+ * @template A The type of actions the reducer can potentially respond to.
45
48
*/
46
- export type Reducer < S > = < A extends Action > ( state : S | undefined , action : A ) => S ;
49
+ export type Reducer < S = any , A extends Action = Action > = ( state : S | undefined , action : A ) => S ;
47
50
48
51
/**
49
52
* Object whose values correspond to different reducer functions.
53
+ *
54
+ * @template A The type of actions the reducers can potentially respond to.
50
55
*/
51
- export type ReducersMapObject < S > = {
52
- [ K in keyof S ] : Reducer < S [ K ] > ;
56
+ export type ReducersMapObject < S = any , A extends Action = Action > = {
57
+ [ K in keyof S ] : Reducer < S [ K ] , A > ;
53
58
}
54
59
55
60
/**
@@ -70,7 +75,7 @@ export type ReducersMapObject<S> = {
70
75
* @returns A reducer function that invokes every reducer inside the passed
71
76
* object, and builds a state object with the same shape.
72
77
*/
73
- export function combineReducers < S > ( reducers : ReducersMapObject < S > ) : Reducer < S > ;
78
+ export function combineReducers < S , A extends Action = Action > ( reducers : ReducersMapObject < S , A > ) : Reducer < S , A > ;
74
79
75
80
76
81
/* store */
@@ -92,9 +97,11 @@ export function combineReducers<S>(reducers: ReducersMapObject<S>): Reducer<S>;
92
97
* function to handle async actions in addition to actions. Middleware may
93
98
* transform, delay, ignore, or otherwise interpret actions or async actions
94
99
* before passing them to the next middleware.
100
+ *
101
+ * @template D the type of things (actions or otherwise) which may be dispatched.
95
102
*/
96
- export interface Dispatch < S > {
97
- < A extends Action > ( action : A ) : A ;
103
+ export interface Dispatch < D = Action > {
104
+ < A extends D > ( action : A ) : A ;
98
105
}
99
106
100
107
/**
@@ -109,9 +116,11 @@ export interface Unsubscribe {
109
116
* There should only be a single store in a Redux app, as the composition
110
117
* happens on the reducer level.
111
118
*
112
- * @template S State object type.
119
+ * @template S The type of state held by this store.
120
+ * @template A the type of actions which may be dispatched by this store.
121
+ * @template N The type of non-actions which may be dispatched by this store.
113
122
*/
114
- export interface Store < S > {
123
+ export interface Store < S = any , A extends Action = Action , N = never > {
115
124
/**
116
125
* Dispatches an action. It is the only way to trigger a state change.
117
126
*
@@ -138,7 +147,7 @@ export interface Store<S> {
138
147
* Note that, if you use a custom middleware, it may wrap `dispatch()` to
139
148
* return something else (for example, a Promise you can await).
140
149
*/
141
- dispatch : Dispatch < S > ;
150
+ dispatch : Dispatch < A | N > ;
142
151
143
152
/**
144
153
* Reads the state tree managed by the store.
@@ -182,7 +191,7 @@ export interface Store<S> {
182
191
*
183
192
* @param nextReducer The reducer for the store to use instead.
184
193
*/
185
- replaceReducer ( nextReducer : Reducer < S > ) : void ;
194
+ replaceReducer ( nextReducer : Reducer < S , A > ) : void ;
186
195
}
187
196
188
197
/**
@@ -191,11 +200,13 @@ export interface Store<S> {
191
200
* `createStore(reducer, preloadedState)` exported from the Redux package, from
192
201
* store creators that are returned from the store enhancers.
193
202
*
194
- * @template S State object type.
203
+ * @template S The type of state to be held by the store.
204
+ * @template A The type of actions which may be dispatched.
205
+ * @template D The type of all things which may be dispatched.
195
206
*/
196
207
export interface StoreCreator {
197
- < S > ( reducer : Reducer < S > , enhancer ?: StoreEnhancer < S > ) : Store < S > ;
198
- < S > ( reducer : Reducer < S > , preloadedState : S , enhancer ?: StoreEnhancer < S > ) : Store < S > ;
208
+ < S , A extends Action , N > ( reducer : Reducer < S , A > , enhancer ?: StoreEnhancer < N > ) : Store < S , A , N > ;
209
+ < S , A extends Action , N > ( reducer : Reducer < S , A > , preloadedState : S , enhancer ?: StoreEnhancer < N > ) : Store < S , A , N > ;
199
210
}
200
211
201
212
/**
@@ -215,10 +226,11 @@ export interface StoreCreator {
215
226
* provided by the developer tools. It is what makes time travel possible
216
227
* without the app being aware it is happening. Amusingly, the Redux
217
228
* middleware implementation is itself a store enhancer.
229
+ *
218
230
*/
219
- export type StoreEnhancer < S > = ( next : StoreEnhancerStoreCreator < S > ) => StoreEnhancerStoreCreator < S > ;
220
- export type GenericStoreEnhancer = < S > ( next : StoreEnhancerStoreCreator < S > ) => StoreEnhancerStoreCreator < S > ;
221
- export type StoreEnhancerStoreCreator < S > = ( reducer : Reducer < S > , preloadedState ?: S ) => Store < S > ;
231
+ export type StoreEnhancer < N = never > = ( next : StoreEnhancerStoreCreator < N > ) => StoreEnhancerStoreCreator < N > ;
232
+ export type GenericStoreEnhancer < N = never > = StoreEnhancer < N > ;
233
+ export type StoreEnhancerStoreCreator < N = never > = < S = any , A extends Action = Action > ( reducer : Reducer < S , A > , preloadedState ?: S ) => Store < S , A , N > ;
222
234
223
235
/**
224
236
* Creates a Redux store that holds the state tree.
@@ -253,8 +265,8 @@ export const createStore: StoreCreator;
253
265
254
266
/* middleware */
255
267
256
- export interface MiddlewareAPI < S > {
257
- dispatch : Dispatch < S > ;
268
+ export interface MiddlewareAPI < S = any , D = Action > {
269
+ dispatch : Dispatch < D > ;
258
270
getState ( ) : S ;
259
271
}
260
272
@@ -268,7 +280,7 @@ export interface MiddlewareAPI<S> {
268
280
* asynchronous API call into a series of synchronous actions.
269
281
*/
270
282
export interface Middleware {
271
- < S > ( api : MiddlewareAPI < S > ) : ( next : Dispatch < S > ) => Dispatch < S > ;
283
+ < S = any , D = Action > ( api : MiddlewareAPI < S , D > ) : ( next : Dispatch < D > ) => Dispatch < D > ;
272
284
}
273
285
274
286
/**
@@ -317,8 +329,8 @@ export interface ActionCreator<A> {
317
329
/**
318
330
* Object whose values are action creator functions.
319
331
*/
320
- export interface ActionCreatorsMapObject {
321
- [ key : string ] : ActionCreator < any > ;
332
+ export interface ActionCreatorsMapObject < A = any > {
333
+ [ key : string ] : ActionCreator < A > ;
322
334
}
323
335
324
336
/**
@@ -340,18 +352,18 @@ export interface ActionCreatorsMapObject {
340
352
* creator wrapped into the `dispatch` call. If you passed a function as
341
353
* `actionCreator`, the return value will also be a single function.
342
354
*/
343
- export function bindActionCreators < A extends ActionCreator < any > > ( actionCreator : A , dispatch : Dispatch < any > ) : A ;
355
+ export function bindActionCreators < A , C extends ActionCreator < A > > ( actionCreator : C , dispatch : Dispatch < A > ) : C ;
344
356
345
357
export function bindActionCreators <
346
358
A extends ActionCreator < any > ,
347
359
B extends ActionCreator < any >
348
360
> ( actionCreator : A , dispatch : Dispatch < any > ) : B ;
349
361
350
- export function bindActionCreators < M extends ActionCreatorsMapObject > ( actionCreators : M , dispatch : Dispatch < any > ) : M ;
362
+ export function bindActionCreators < A , M extends ActionCreatorsMapObject < A > > ( actionCreators : M , dispatch : Dispatch < A > ) : M ;
351
363
352
364
export function bindActionCreators <
353
- M extends ActionCreatorsMapObject ,
354
- N extends ActionCreatorsMapObject
365
+ M extends ActionCreatorsMapObject < any > ,
366
+ N extends ActionCreatorsMapObject < any >
355
367
> ( actionCreators : M , dispatch : Dispatch < any > ) : N ;
356
368
357
369
0 commit comments