diff --git a/src/createSlice.ts b/src/createSlice.ts index 53b885a6ed..baac7a0f08 100644 --- a/src/createSlice.ts +++ b/src/createSlice.ts @@ -6,11 +6,12 @@ import { createSliceSelector, createSelectorName } from './sliceSelector' /** * An action creator atttached to a slice. */ -export type SliceActionCreator

= (payload: P) => PayloadAction

+export type SliceActionCreator = P extends void + ? () => Action + : (payload: P) => PayloadAction export interface Slice< S = any, - A extends Action = AnyAction, AP extends { [key: string]: any } = { [key: string]: any } > { /** @@ -21,13 +22,15 @@ export interface Slice< /** * The slice's reducer. */ - reducer: Reducer + reducer: Reducer /** * Action creators for the types of actions that are handled by the slice * reducer. */ - actions: { [type in keyof AP]: SliceActionCreator } + actions: { + [type in keyof AP]: SliceActionCreator> + } /** * Selectors for the slice reducer state. `createSlice()` inserts a single @@ -101,9 +104,7 @@ export function createSlice< S = any, A extends PayloadAction = PayloadAction, CR extends CaseReducersMapObject = CaseReducersMapObject ->( - options: CreateSliceOptions -): Slice> { +>(options: CreateSliceOptions): Slice> { const { slice = '', initialState } = options const reducers = options.reducers || {} const extraReducers = options.extraReducers || {} diff --git a/type-tests/files/createSlice.typetest.ts b/type-tests/files/createSlice.typetest.ts index a048746361..4698e49271 100644 --- a/type-tests/files/createSlice.typetest.ts +++ b/type-tests/files/createSlice.typetest.ts @@ -1,4 +1,5 @@ import { + Action, AnyAction, createSlice, PayloadAction, @@ -64,6 +65,10 @@ import { } }) + const increment: () => Action<'increment'> = counter.actions.increment + const multiply: (payload: number) => PayloadAction = + counter.actions.multiply + counter.actions.increment() counter.actions.multiply(2)