@@ -64,11 +64,13 @@ function stateExtension() {
64
64
reducer : Reducer < S , A > ,
65
65
preloadedState ?: any
66
66
) => {
67
- const wrappedReducer : Reducer < S & ExtraState , A > = ( state , action ) => {
68
- const newState = reducer ( state , action )
69
- return {
70
- ...newState ,
71
- extraField : 'extra'
67
+ function wrapReducer ( reducer : Reducer < S , A > ) : Reducer < S & ExtraState , A > {
68
+ return ( state , action ) => {
69
+ const newState = reducer ( state , action )
70
+ return {
71
+ ...newState ,
72
+ extraField : 'extra'
73
+ }
72
74
}
73
75
}
74
76
const wrappedPreloadedState = preloadedState
@@ -77,7 +79,13 @@ function stateExtension() {
77
79
extraField : 'extra'
78
80
}
79
81
: undefined
80
- return createStore ( wrappedReducer , wrappedPreloadedState )
82
+ const store = createStore ( wrapReducer ( reducer ) , wrappedPreloadedState )
83
+ return {
84
+ ...store ,
85
+ replaceReducer ( nextReducer : Reducer < S , A > ) {
86
+ store . replaceReducer ( wrapReducer ( nextReducer ) )
87
+ }
88
+ }
81
89
}
82
90
83
91
const store = createStore ( reducer , enhancer )
@@ -96,8 +104,10 @@ function extraMethods() {
96
104
createStore =>
97
105
( ...args ) => {
98
106
const store = createStore ( ...args )
99
- store . method = ( ) => 'foo'
100
- return store
107
+ return {
108
+ ...store ,
109
+ method : ( ) => 'foo'
110
+ }
101
111
}
102
112
103
113
const store = createStore ( reducer , enhancer )
@@ -122,11 +132,13 @@ function replaceReducerExtender() {
122
132
reducer : Reducer < S , A > ,
123
133
preloadedState ?: any
124
134
) => {
125
- const wrappedReducer : Reducer < S & ExtraState , A > = ( state , action ) => {
126
- const newState = reducer ( state , action )
127
- return {
128
- ...newState ,
129
- extraField : 'extra'
135
+ function wrapReducer ( reducer : Reducer < S , A > ) : Reducer < S & ExtraState , A > {
136
+ return ( state , action ) => {
137
+ const newState = reducer ( state , action )
138
+ return {
139
+ ...newState ,
140
+ extraField : 'extra'
141
+ }
130
142
}
131
143
}
132
144
const wrappedPreloadedState = preloadedState
@@ -135,7 +147,14 @@ function replaceReducerExtender() {
135
147
extraField : 'extra'
136
148
}
137
149
: undefined
138
- return createStore ( wrappedReducer , wrappedPreloadedState )
150
+ const store = createStore ( wrapReducer ( reducer ) , wrappedPreloadedState )
151
+ return {
152
+ ...store ,
153
+ replaceReducer ( nextReducer : Reducer < S , A > ) {
154
+ store . replaceReducer ( wrapReducer ( nextReducer ) )
155
+ } ,
156
+ method : ( ) => 'foo'
157
+ }
139
158
}
140
159
141
160
const store = createStore <
@@ -270,14 +289,14 @@ function finalHelmersonExample() {
270
289
< S , A extends Action < unknown > > (
271
290
reducer : Reducer < S , A > ,
272
291
preloadedState ?: any
273
- ) : Store < S , A , ExtraState > & { persistor : Store < S , A , ExtraState > } => {
292
+ ) => {
274
293
const persistedReducer = persistReducer < S , A > ( persistConfig , reducer )
275
294
const store = createStore ( persistedReducer , preloadedState )
276
295
const persistor = persistStore ( store )
277
296
278
297
return {
279
298
...store ,
280
- replaceReducer : nextReducer => {
299
+ replaceReducer : ( nextReducer : Reducer < S , A > ) => {
281
300
store . replaceReducer ( persistReducer ( persistConfig , nextReducer ) )
282
301
} ,
283
302
persistor
@@ -308,3 +327,44 @@ function finalHelmersonExample() {
308
327
// @ts -expect-error
309
328
store . getState ( ) . wrongField
310
329
}
330
+
331
+ function composedEnhancers ( ) {
332
+ interface State {
333
+ someState : string
334
+ }
335
+ const reducer : Reducer < State > = null as any
336
+
337
+ interface Ext1 {
338
+ enhancer1 : string
339
+ }
340
+ interface Ext2 {
341
+ enhancer2 : number
342
+ }
343
+
344
+ const enhancer1 : StoreEnhancer < Ext1 > =
345
+ createStore => ( reducer , preloadedState ) => {
346
+ const store = createStore ( reducer , preloadedState )
347
+ return {
348
+ ...store ,
349
+ enhancer1 : 'foo'
350
+ }
351
+ }
352
+
353
+ const enhancer2 : StoreEnhancer < Ext2 > =
354
+ createStore => ( reducer , preloadedState ) => {
355
+ const store = createStore ( reducer , preloadedState )
356
+ return {
357
+ ...store ,
358
+ enhancer2 : 5
359
+ }
360
+ }
361
+
362
+ const composedEnhancer : StoreEnhancer < Ext1 & Ext2 > = createStore =>
363
+ enhancer2 ( enhancer1 ( createStore ) )
364
+
365
+ const enhancedStore = createStore ( reducer , composedEnhancer )
366
+ enhancedStore . enhancer1
367
+ enhancedStore . enhancer2
368
+ // @ts -expect-error
369
+ enhancedStore . enhancer3
370
+ }
0 commit comments