Skip to content

Commit 84bb039

Browse files
committed
fix caching bug and add test
1 parent f5c46a2 commit 84bb039

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

packages/toolkit/src/createSlice.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ export function buildCreateSlice({ creators }: BuildCreateSliceConfig = {}) {
740740
const selectSelf = (state: State) => state
741741

742742
const injectedSelectorCache = new Map<
743-
string,
743+
boolean,
744744
WeakMap<
745745
(rootState: any) => State | undefined,
746746
Record<string, (rootState: any) => any>
@@ -784,7 +784,7 @@ export function buildCreateSlice({ creators }: BuildCreateSliceConfig = {}) {
784784
function getSelectors(
785785
selectState: (rootState: any) => State = selectSelf
786786
) {
787-
const selectorCache = emplace(injectedSelectorCache, reducerPath, {
787+
const selectorCache = emplace(injectedSelectorCache, injected, {
788788
insert: () => new WeakMap(),
789789
})
790790

packages/toolkit/src/tests/createSlice.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,36 @@ describe('createSlice', () => {
596596
(slice.getInitialState() + 1) * 2
597597
)
598598
})
599+
it('avoids incorrectly caching selectors', () => {
600+
const slice = createSlice({
601+
name: 'counter',
602+
reducerPath: 'injected',
603+
initialState: 42,
604+
reducers: {
605+
increment: (state) => ++state,
606+
},
607+
selectors: {
608+
selectMultiple: (state, multiplier: number) => state * multiplier,
609+
},
610+
})
611+
expect(slice.getSelectors()).toBe(slice.getSelectors())
612+
const combinedReducer = combineSlices({
613+
static: slice.reducer,
614+
}).withLazyLoadedSlices<WithSlice<typeof slice>>()
615+
616+
const injected = slice.injectInto(combinedReducer)
617+
618+
expect(injected.getSelectors()).not.toBe(slice.getSelectors())
619+
620+
expect(injected.getSelectors().selectMultiple(undefined, 1)).toBe(42)
621+
622+
expect(() =>
623+
// @ts-expect-error
624+
slice.getSelectors().selectMultiple(undefined, 1)
625+
).toThrowErrorMatchingInlineSnapshot(
626+
`[Error: selectState returned undefined for an uninjected slice reducer]`
627+
)
628+
})
599629
})
600630
describe('reducers definition with asyncThunks', () => {
601631
it('is disabled by default', () => {

0 commit comments

Comments
 (0)