5
5
PayloadAction ,
6
6
PayloadActionCreator ,
7
7
PrepareAction ,
8
- _ActionCreatorWithPreparedPayload
8
+ _ActionCreatorWithPreparedPayload ,
9
+ _PayloadActionForPrepare
9
10
} from './createAction'
10
11
import { CaseReducer , CaseReducers , createReducer } from './createReducer'
11
12
import {
@@ -109,7 +110,8 @@ export interface CreateSliceOptions<
109
110
110
111
const reducerDefinitionType : unique symbol = Symbol ( 'reducerType' )
111
112
const enum ReducerType {
112
- asyncThunk = 0
113
+ asyncThunk = 1 ,
114
+ reducerWithPrepare = 2
113
115
}
114
116
115
117
/**
@@ -159,6 +161,13 @@ export interface AsyncThunkSliceReducerDefinition<
159
161
payloadCreator : AsyncThunkPayloadCreator < Returned , ThunkArg , ThunkApiConfig >
160
162
}
161
163
164
+ export interface CaseReducerWithPrepareDefinition <
165
+ State ,
166
+ Action extends PayloadAction
167
+ > extends CaseReducerWithPrepare < State , Action > {
168
+ [ reducerDefinitionType ] : ReducerType . reducerWithPrepare
169
+ }
170
+
162
171
interface ReducerCreators < State > {
163
172
asyncThunk <
164
173
ThunkArg extends any ,
@@ -177,6 +186,15 @@ interface ReducerCreators<State> {
177
186
ThunkApiConfig
178
187
>
179
188
) : AsyncThunkSliceReducerDefinition < State , ThunkArg , Returned , ThunkApiConfig >
189
+
190
+ preparedReducer < Prepare extends PrepareAction < any > > (
191
+ prepare : Prepare ,
192
+ reducer : CaseReducer < State , _PayloadActionForPrepare < Prepare > >
193
+ ) : {
194
+ [ reducerDefinitionType ] : ReducerType . reducerWithPrepare
195
+ prepare : Prepare
196
+ reducer : CaseReducer < State , _PayloadActionForPrepare < Prepare > >
197
+ }
180
198
}
181
199
182
200
/**
@@ -325,7 +343,11 @@ export function createSlice<
325
343
326
344
reducerNames . forEach ( reducerName => {
327
345
const reducerDefinition = reducers [ reducerName ]
328
- const reducerDetails = { reducerName, type : getType ( name , reducerName ) }
346
+ const reducerDetails = {
347
+ reducerName,
348
+ type : getType ( name , reducerName ) ,
349
+ isCreateNotation : typeof options . reducers === 'function'
350
+ }
329
351
330
352
if ( isAsyncThunkSliceReducerDefinition < State > ( reducerDefinition ) ) {
331
353
handleThunkCaseReducerDefinition (
@@ -379,6 +401,7 @@ interface ReducerHandlingContext<State> {
379
401
interface ReducerDetails {
380
402
reducerName : string
381
403
type : string
404
+ createNotation : boolean
382
405
}
383
406
384
407
function getReducerCreators < State > ( ) : ReducerCreators < State > {
@@ -389,12 +412,19 @@ function getReducerCreators<State>(): ReducerCreators<State> {
389
412
...config ,
390
413
payloadCreator
391
414
}
415
+ } ,
416
+ preparedReducer ( prepare , reducer ) {
417
+ return {
418
+ [ reducerDefinitionType ] : ReducerType . reducerWithPrepare ,
419
+ prepare,
420
+ reducer
421
+ }
392
422
}
393
423
}
394
424
}
395
425
396
426
function handleNormalReducerDefinition < State > (
397
- { type, reducerName } : ReducerDetails ,
427
+ { type, reducerName, createNotation } : ReducerDetails ,
398
428
maybeReducerWithPrepare :
399
429
| CaseReducer < State , { payload : any ; type : string } >
400
430
| CaseReducerWithPrepare < State , PayloadAction < any , string , any , any > > ,
@@ -403,6 +433,14 @@ function handleNormalReducerDefinition<State>(
403
433
let caseReducer : CaseReducer < State , any >
404
434
let prepareCallback : PrepareAction < any > | undefined
405
435
if ( 'reducer' in maybeReducerWithPrepare ) {
436
+ if (
437
+ createNotation &&
438
+ ! isCaseReducerWithPrepareDefinition ( maybeReducerWithPrepare )
439
+ ) {
440
+ throw new Error (
441
+ 'Please use the `create.preparedReducer` notation for prepared action creators with the `create` notation.'
442
+ )
443
+ }
406
444
caseReducer = maybeReducerWithPrepare . reducer
407
445
prepareCallback = maybeReducerWithPrepare . prepare
408
446
} else {
@@ -421,6 +459,14 @@ function isAsyncThunkSliceReducerDefinition<State>(
421
459
return reducerDefinition [ reducerDefinitionType ] === ReducerType . asyncThunk
422
460
}
423
461
462
+ function isCaseReducerWithPrepareDefinition < State > (
463
+ reducerDefinition : any
464
+ ) : reducerDefinition is CaseReducerWithPrepareDefinition < State , any > {
465
+ return (
466
+ reducerDefinition [ reducerDefinitionType ] === ReducerType . reducerWithPrepare
467
+ )
468
+ }
469
+
424
470
function handleThunkCaseReducerDefinition < State > (
425
471
{ type, reducerName } : ReducerDetails ,
426
472
reducerDefinition : AsyncThunkSliceReducerDefinition < State , any , any , any > ,
0 commit comments