diff --git a/packages/toolkit/src/createSlice.ts b/packages/toolkit/src/createSlice.ts index 6158920af..165f5a8d1 100644 --- a/packages/toolkit/src/createSlice.ts +++ b/packages/toolkit/src/createSlice.ts @@ -427,15 +427,7 @@ export interface ReducerCreators { * @public */ export type SliceCaseReducers = - | Record< - string, - | CaseReducerDefinition> - | CaseReducerWithPrepareDefinition< - State, - PayloadAction - > - | AsyncThunkSliceReducerDefinition - > + | Record | Record< string, | CaseReducer> @@ -692,7 +684,7 @@ export function buildCreateSlice({ creators }: BuildCreateSliceConfig = {}) { } else { handleNormalReducerDefinition( reducerDetails, - reducerDefinition, + reducerDefinition as any, contextMethods, ) } diff --git a/packages/toolkit/src/tests/createSlice.test-d.ts b/packages/toolkit/src/tests/createSlice.test-d.ts index d76d8fa5e..866649700 100644 --- a/packages/toolkit/src/tests/createSlice.test-d.ts +++ b/packages/toolkit/src/tests/createSlice.test-d.ts @@ -652,6 +652,38 @@ describe('type tests', () => { expectTypeOf(action.error).toEqualTypeOf<'error'>() }, ), + testInferVoid: create.asyncThunk(() => {}, { + pending(state, action) { + expectTypeOf(state).toEqualTypeOf() + + expectTypeOf(action.meta.arg).toBeVoid() + }, + fulfilled(state, action) { + expectTypeOf(state).toEqualTypeOf() + + expectTypeOf(action.meta.arg).toBeVoid() + + expectTypeOf(action.payload).toBeVoid() + }, + rejected(state, action) { + expectTypeOf(state).toEqualTypeOf() + + expectTypeOf(action.meta.arg).toBeVoid() + + expectTypeOf(action.error).toEqualTypeOf() + }, + settled(state, action) { + expectTypeOf(state).toEqualTypeOf() + + expectTypeOf(action.meta.arg).toBeVoid() + + if (isRejected(action)) { + expectTypeOf(action.error).toEqualTypeOf() + } else { + expectTypeOf(action.payload).toBeVoid() + } + }, + }), testInfer: create.asyncThunk( function payloadCreator(arg: TestArg, api) { return Promise.resolve({ payload: 'foo' }) @@ -856,6 +888,12 @@ describe('type tests', () => { > >() + expectTypeOf(slice.actions.testInferVoid).toEqualTypeOf< + AsyncThunk + >() + + expectTypeOf(slice.actions.testInferVoid).toBeCallableWith() + expectTypeOf(slice.actions.testInfer).toEqualTypeOf< AsyncThunk >() diff --git a/packages/toolkit/src/tests/createSlice.test.ts b/packages/toolkit/src/tests/createSlice.test.ts index 3f6bdc5d9..123b86ad0 100644 --- a/packages/toolkit/src/tests/createSlice.test.ts +++ b/packages/toolkit/src/tests/createSlice.test.ts @@ -678,7 +678,7 @@ describe('createSlice', () => { initialState: [] as any[], reducers: (create) => ({ thunkReducers: create.asyncThunk( - function payloadCreator(arg, api) { + function payloadCreator(arg: string, api) { return Promise.resolve('resolved payload') }, { pending, fulfilled, rejected, settled }, @@ -722,7 +722,7 @@ describe('createSlice', () => { reducers: (create) => ({ thunkReducers: create.asyncThunk( // payloadCreator isn't allowed to return never - function payloadCreator(arg, api): any { + function payloadCreator(arg: string, api): any { throw new Error('') }, { pending, fulfilled, rejected, settled }, @@ -765,7 +765,7 @@ describe('createSlice', () => { initialState: [] as any[], reducers: (create) => ({ thunkReducers: create.asyncThunk( - function payloadCreator(arg, api) { + function payloadCreator(arg: string, api) { return 'should not call this' }, { @@ -833,7 +833,6 @@ describe('createSlice', () => { slice.actions.thunkReducers.rejected( new Error('test'), 'fakeRequestId', - {}, ), ), ).not.toThrow()