Skip to content

Commit

Permalink
Merge pull request #4080 from aryaemami59/fix-createDraftSafeSelector…
Browse files Browse the repository at this point in the history
…-withTypes

Add `.withTypes` to `createDraftSafeSelector`
  • Loading branch information
EskiMojo14 committed Jan 15, 2024
2 parents 0ffabd9 + f650bcb commit b283b1c
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 7 deletions.
18 changes: 11 additions & 7 deletions packages/toolkit/src/createDraftSafeSelector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -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<RootState>()

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
})
})

0 comments on commit b283b1c

Please sign in to comment.