import type { EntityAdapter, ActionCreatorWithPayload, ActionCreatorWithoutPayload, EntityStateAdapter, EntityId, Update, } from '@reduxjs/toolkit' import { createSlice, createEntityAdapter } from '@reduxjs/toolkit' import { expectType } from './helpers' function extractReducers( adapter: EntityAdapter ): Omit, 'map'> { const { selectId, sortComparer, getInitialState, getSelectors, ...rest } = adapter return rest } /** * should be usable in a slice, with all the "reducer-like" functions */ { type Entity = { value: string } const adapter = createEntityAdapter() const slice = createSlice({ name: 'test', initialState: adapter.getInitialState(), reducers: { ...extractReducers(adapter), }, }) expectType>(slice.actions.addOne) expectType< ActionCreatorWithPayload | Record> >(slice.actions.addMany) expectType< ActionCreatorWithPayload | Record> >(slice.actions.setAll) expectType>>( // @ts-expect-error slice.actions.addMany ) expectType>>( // @ts-expect-error slice.actions.setAll ) expectType>(slice.actions.removeOne) expectType>>( slice.actions.removeMany ) // @ts-expect-error expectType>(slice.actions.removeMany) expectType(slice.actions.removeAll) expectType>>(slice.actions.updateOne) expectType[]>>( // @ts-expect-error slice.actions.updateMany ) expectType>>>( slice.actions.updateMany ) expectType>(slice.actions.upsertOne) expectType< ActionCreatorWithPayload | Record> >(slice.actions.upsertMany) expectType>>( // @ts-expect-error slice.actions.upsertMany ) } /** * should not be able to mix with a different EntityAdapter */ { type Entity = { value: string } type Entity2 = { value2: string } const adapter = createEntityAdapter() const adapter2 = createEntityAdapter() createSlice({ name: 'test', initialState: adapter.getInitialState(), reducers: { addOne: adapter.addOne, // @ts-expect-error addOne2: adapter2.addOne, }, }) } /** * should be usable in a slice with extra properties */ { type Entity = { value: string } const adapter = createEntityAdapter() createSlice({ name: 'test', initialState: adapter.getInitialState({ extraData: 'test' }), reducers: { addOne: adapter.addOne, }, }) } /** * should not be usable in a slice with an unfitting state */ { type Entity = { value: string } const adapter = createEntityAdapter() createSlice({ name: 'test', initialState: { somethingElse: '' }, reducers: { // @ts-expect-error addOne: adapter.addOne, }, }) }