From 24ff839c588a05527913c327a50ca75e5ebd54b5 Mon Sep 17 00:00:00 2001 From: Arya Emami Date: Sun, 14 Jan 2024 18:31:30 -0600 Subject: [PATCH 1/2] Add `.withTypes` to `createDraftSafeSelector` --- .../toolkit/src/createDraftSafeSelector.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/toolkit/src/createDraftSafeSelector.ts b/packages/toolkit/src/createDraftSafeSelector.ts index 6fe8d267d2..67b5465687 100644 --- a/packages/toolkit/src/createDraftSafeSelector.ts +++ b/packages/toolkit/src/createDraftSafeSelector.ts @@ -5,13 +5,17 @@ export const createDraftSafeSelectorCreator: typeof createSelectorCreator = ( ...args: unknown[] ) => { const createSelector = (createSelectorCreator as any)(...args) - return (...args: unknown[]) => { - const selector = createSelector(...args) - const wrappedSelector = (value: unknown, ...rest: unknown[]) => - selector(isDraft(value) ? current(value) : value, ...rest) - Object.assign(wrappedSelector, selector) - return wrappedSelector as any - } + const createDraftSafeSelector = Object.assign( + (...args: unknown[]) => { + const selector = createSelector(...args) + const wrappedSelector = (value: unknown, ...rest: unknown[]) => + selector(isDraft(value) ? current(value) : value, ...rest) + Object.assign(wrappedSelector, selector) + return wrappedSelector as any + }, + { withTypes: () => createDraftSafeSelector } + ) + return createDraftSafeSelector } /** From f650bcb14c3736f6e0de2a6cb2e6c80e961dca5f Mon Sep 17 00:00:00 2001 From: Arya Emami Date: Sun, 14 Jan 2024 18:40:53 -0600 Subject: [PATCH 2/2] Add runtime tests for `createDraftSafeSelector.withTypes` --- .../createDraftSafeSelector.withTypes.test.ts | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 packages/toolkit/src/tests/createDraftSafeSelector.withTypes.test.ts diff --git a/packages/toolkit/src/tests/createDraftSafeSelector.withTypes.test.ts b/packages/toolkit/src/tests/createDraftSafeSelector.withTypes.test.ts new file mode 100644 index 0000000000..cb70812d46 --- /dev/null +++ b/packages/toolkit/src/tests/createDraftSafeSelector.withTypes.test.ts @@ -0,0 +1,49 @@ +import { createDraftSafeSelector } from '@reduxjs/toolkit' + +interface Todo { + id: number + completed: boolean +} + +interface Alert { + id: number + read: boolean +} + +interface RootState { + todos: Todo[] + alerts: Alert[] +} + +const rootState: RootState = { + todos: [ + { id: 0, completed: false }, + { id: 1, completed: false }, + ], + alerts: [ + { id: 0, read: false }, + { id: 1, read: false }, + ], +} + +describe(createDraftSafeSelector.withTypes, () => { + const createTypedDraftSafeSelector = + createDraftSafeSelector.withTypes() + + test('should return createDraftSafeSelector', () => { + expect(createTypedDraftSafeSelector.withTypes).toEqual(expect.any(Function)) + + expect(createTypedDraftSafeSelector.withTypes().withTypes).toEqual( + expect.any(Function) + ) + + expect(createTypedDraftSafeSelector).toBe(createDraftSafeSelector) + + const selectTodoIds = createTypedDraftSafeSelector( + [(state) => state.todos], + (todos) => todos.map(({ id }) => id) + ) + + expect(selectTodoIds(rootState)).to.be.an('array').that.is.not.empty + }) +})