Skip to content

Commit b283b1c

Browse files
authored
Merge pull request #4080 from aryaemami59/fix-createDraftSafeSelector-withTypes
Add `.withTypes` to `createDraftSafeSelector`
2 parents 0ffabd9 + f650bcb commit b283b1c

File tree

2 files changed

+60
-7
lines changed

2 files changed

+60
-7
lines changed

packages/toolkit/src/createDraftSafeSelector.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@ export const createDraftSafeSelectorCreator: typeof createSelectorCreator = (
55
...args: unknown[]
66
) => {
77
const createSelector = (createSelectorCreator as any)(...args)
8-
return (...args: unknown[]) => {
9-
const selector = createSelector(...args)
10-
const wrappedSelector = (value: unknown, ...rest: unknown[]) =>
11-
selector(isDraft(value) ? current(value) : value, ...rest)
12-
Object.assign(wrappedSelector, selector)
13-
return wrappedSelector as any
14-
}
8+
const createDraftSafeSelector = Object.assign(
9+
(...args: unknown[]) => {
10+
const selector = createSelector(...args)
11+
const wrappedSelector = (value: unknown, ...rest: unknown[]) =>
12+
selector(isDraft(value) ? current(value) : value, ...rest)
13+
Object.assign(wrappedSelector, selector)
14+
return wrappedSelector as any
15+
},
16+
{ withTypes: () => createDraftSafeSelector }
17+
)
18+
return createDraftSafeSelector
1519
}
1620

1721
/**
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { createDraftSafeSelector } from '@reduxjs/toolkit'
2+
3+
interface Todo {
4+
id: number
5+
completed: boolean
6+
}
7+
8+
interface Alert {
9+
id: number
10+
read: boolean
11+
}
12+
13+
interface RootState {
14+
todos: Todo[]
15+
alerts: Alert[]
16+
}
17+
18+
const rootState: RootState = {
19+
todos: [
20+
{ id: 0, completed: false },
21+
{ id: 1, completed: false },
22+
],
23+
alerts: [
24+
{ id: 0, read: false },
25+
{ id: 1, read: false },
26+
],
27+
}
28+
29+
describe(createDraftSafeSelector.withTypes, () => {
30+
const createTypedDraftSafeSelector =
31+
createDraftSafeSelector.withTypes<RootState>()
32+
33+
test('should return createDraftSafeSelector', () => {
34+
expect(createTypedDraftSafeSelector.withTypes).toEqual(expect.any(Function))
35+
36+
expect(createTypedDraftSafeSelector.withTypes().withTypes).toEqual(
37+
expect.any(Function)
38+
)
39+
40+
expect(createTypedDraftSafeSelector).toBe(createDraftSafeSelector)
41+
42+
const selectTodoIds = createTypedDraftSafeSelector(
43+
[(state) => state.todos],
44+
(todos) => todos.map(({ id }) => id)
45+
)
46+
47+
expect(selectTodoIds(rootState)).to.be.an('array').that.is.not.empty
48+
})
49+
})

0 commit comments

Comments
 (0)