Skip to content

Commit 25435d0

Browse files
authored
Merge pull request #1772 from reduxjs/feature/thunk-type-updates
2 parents ec7b17d + 23e0635 commit 25435d0

File tree

7 files changed

+112
-27
lines changed

7 files changed

+112
-27
lines changed

packages/action-listener-middleware/src/tests/listenerMiddleware.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,8 @@ describe('createActionListenerMiddleware', () => {
347347
listener,
348348
})
349349
)
350+
// TODO This hopefully will be resolved in RTK 1.7 / thunk 2.4.1
351+
// @ts-expect-error
350352
expectType<Action<'actionListenerMiddleware/add'>>(unsubscribe)
351353

352354
store.dispatch(testAction1('a'))

packages/toolkit/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,14 @@
100100
"query"
101101
],
102102
"dependencies": {
103-
"immer": "^9.0.6",
103+
"immer": "^9.0.7",
104104
"redux": "^4.1.2",
105-
"redux-thunk": "^2.4.0",
106-
"reselect": "^4.1.2"
105+
"redux-thunk": "^2.4.1",
106+
"reselect": "^4.1.5"
107107
},
108108
"peerDependencies": {
109-
"react": "^16.9.0 || ^17.0.0",
110-
"react-redux": "^7.2.1"
109+
"react": "^16.9.0 || ^17.0.0 || 18.0.0-beta",
110+
"react-redux": "^7.2.1 || ^8.0.0-beta"
111111
},
112112
"peerDependenciesMeta": {
113113
"react": {

packages/toolkit/src/configureStore.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ export interface EnhancedStore<
110110
*
111111
* @inheritdoc
112112
*/
113-
dispatch: DispatchForMiddlewares<M> & Dispatch<A>
113+
dispatch: Dispatch<A> & DispatchForMiddlewares<M>
114114
}
115115

116116
/**

packages/toolkit/src/entities/state_selectors.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { Selector } from 'reselect'
12
import { createDraftSafeSelector } from '../createDraftSafeSelector'
23
import type {
34
EntityState,
@@ -11,21 +12,20 @@ export function createSelectorsFactory<T>() {
1112
function getSelectors<V>(
1213
selectState: (state: V) => EntityState<T>
1314
): EntitySelectors<T, V>
14-
function getSelectors(
15-
selectState?: (state: any) => EntityState<T>
15+
function getSelectors<V>(
16+
selectState?: (state: V) => EntityState<T>
1617
): EntitySelectors<T, any> {
17-
const selectIds = (state: any) => state.ids
18+
const selectIds = (state: EntityState<T>) => state.ids
1819

1920
const selectEntities = (state: EntityState<T>) => state.entities
2021

2122
const selectAll = createDraftSafeSelector(
2223
selectIds,
2324
selectEntities,
24-
(ids: readonly T[], entities: Dictionary<T>): any =>
25-
ids.map((id: any) => (entities as any)[id])
25+
(ids, entities): T[] => ids.map((id) => entities[id]!)
2626
)
2727

28-
const selectId = (_: any, id: EntityId) => id
28+
const selectId = (_: unknown, id: EntityId) => id
2929

3030
const selectById = (entities: Dictionary<T>, id: EntityId) => entities[id]
3131

@@ -46,7 +46,7 @@ export function createSelectorsFactory<T>() {
4646
}
4747

4848
const selectGlobalizedEntities = createDraftSafeSelector(
49-
selectState,
49+
selectState as Selector<V, EntityState<T>>,
5050
selectEntities
5151
)
5252

packages/toolkit/src/query/react/buildHooks.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { AnyAction, ThunkAction, ThunkDispatch } from '@reduxjs/toolkit'
2-
import { createSelector } from '@reduxjs/toolkit'
2+
import { createSelector, Selector } from '@reduxjs/toolkit'
33
import type { DependencyList } from 'react'
44
import {
55
useCallback,
@@ -556,7 +556,7 @@ export function buildHooks<Definitions extends EndpointDefinitions>({
556556
endpointName,
557557
})
558558
)
559-
lastResult = undefined
559+
lastResult = undefined
560560
}
561561

562562
// data is the last known good request result we have tracked - or if none has been tracked yet the last good result for the current args
@@ -789,22 +789,24 @@ export function buildHooks<Definitions extends EndpointDefinitions>({
789789
name
790790
)
791791

792+
type ApiRootState = Parameters<ReturnType<typeof select>>[0]
793+
792794
const lastValue = useRef<any>()
793795

794-
const selectDefaultResult = useMemo(
796+
const selectDefaultResult: Selector<ApiRootState, any, [any]> = useMemo(
795797
() =>
796798
createSelector(
797799
[
798800
select(stableArg),
799-
(_: any, lastResult: any) => lastResult,
800-
() => stableArg,
801+
(_: ApiRootState, lastResult: any) => lastResult,
802+
(_: ApiRootState) => stableArg,
801803
],
802804
queryStatePreSelector
803805
),
804806
[select, stableArg]
805807
)
806808

807-
const querySelector = useMemo(
809+
const querySelector: Selector<ApiRootState, any, [any]> = useMemo(
808810
() => createSelector([selectDefaultResult], selectFromResult),
809811
[selectDefaultResult, selectFromResult]
810812
)

packages/toolkit/src/tests/configureStore.typetest.ts

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
import type { Dispatch, AnyAction, Middleware, Reducer, Store } from 'redux'
33
import { applyMiddleware } from 'redux'
44
import type { PayloadAction } from '@reduxjs/toolkit'
5-
import { configureStore, getDefaultMiddleware } from '@reduxjs/toolkit'
5+
import {
6+
configureStore,
7+
getDefaultMiddleware,
8+
createSlice,
9+
} from '@reduxjs/toolkit'
610
import type { ThunkMiddleware, ThunkAction } from 'redux-thunk'
711
import thunk, { ThunkDispatch } from 'redux-thunk'
812
import { expectNotAny, expectType } from './helpers'
@@ -187,6 +191,60 @@ const _anyMiddleware: any = () => () => () => {}
187191
store.dispatch(thunkA())
188192
// @ts-expect-error
189193
store.dispatch(thunkB())
194+
195+
const res = store.dispatch((dispatch, getState) => {
196+
return 42
197+
})
198+
199+
const action = store.dispatch({ type: 'foo' })
200+
}
201+
/**
202+
* Test: return type of thunks and actions is inferred correctly
203+
*/
204+
{
205+
const slice = createSlice({
206+
name: 'counter',
207+
initialState: {
208+
value: 0,
209+
},
210+
reducers: {
211+
incrementByAmount: (state, action: PayloadAction<number>) => {
212+
state.value += action.payload
213+
},
214+
},
215+
})
216+
217+
const store = configureStore({
218+
reducer: {
219+
counter: slice.reducer,
220+
},
221+
})
222+
223+
const action = slice.actions.incrementByAmount(2)
224+
225+
const dispatchResult = store.dispatch(action)
226+
expectType<{ type: string; payload: number }>(dispatchResult)
227+
228+
const promiseResult = store.dispatch(async (dispatch) => {
229+
return 42
230+
})
231+
232+
expectType<Promise<number>>(promiseResult)
233+
234+
const store2 = configureStore({
235+
reducer: {
236+
counter: slice.reducer,
237+
},
238+
middleware: (gDM) =>
239+
gDM({
240+
thunk: {
241+
extraArgument: 42,
242+
},
243+
}),
244+
})
245+
246+
const dispatchResult2 = store2.dispatch(action)
247+
expectType<{ type: string; payload: number }>(dispatchResult2)
190248
}
191249
/**
192250
* Test: removing the Thunk Middleware

yarn.lock

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5080,7 +5080,7 @@ __metadata:
50805080
eslint-plugin-react: ^7.23.2
50815081
eslint-plugin-react-hooks: ^4.2.0
50825082
fs-extra: ^9.1.0
5083-
immer: ^9.0.6
5083+
immer: ^9.0.7
50845084
invariant: ^2.2.4
50855085
jest: ^26.6.3
50865086
json-stringify-safe: ^5.0.1
@@ -5091,8 +5091,8 @@ __metadata:
50915091
prettier: ^2.2.1
50925092
query-string: ^7.0.1
50935093
redux: ^4.1.2
5094-
redux-thunk: ^2.4.0
5095-
reselect: ^4.1.2
5094+
redux-thunk: ^2.4.1
5095+
reselect: ^4.1.5
50965096
rimraf: ^3.0.2
50975097
rollup: ^2.47.0
50985098
rollup-plugin-strip-code: ^0.2.6
@@ -5104,8 +5104,8 @@ __metadata:
51045104
typescript: ~4.2.4
51055105
yargs: ^15.3.1
51065106
peerDependencies:
5107-
react: ^16.9.0 || ^17.0.0
5108-
react-redux: ^7.2.1
5107+
react: ^16.9.0 || ^17.0.0 || 18.0.0-beta
5108+
react-redux: ^7.2.1 || ^8.0.0-beta
51095109
peerDependenciesMeta:
51105110
react:
51115111
optional: true
@@ -13923,6 +13923,13 @@ fsevents@^1.2.7:
1392313923
languageName: node
1392413924
linkType: hard
1392513925

13926+
"immer@npm:^9.0.7":
13927+
version: 9.0.7
13928+
resolution: "immer@npm:9.0.7"
13929+
checksum: 3655ad64bf5ab5adf2854f7d2a9ad543f2cd995fcd169b6f10294f41fdb2cbcbd44d8beaa3e01b3c0b6149001190e57f6ab2cd735e6a929780b7462f2e973c9b
13930+
languageName: node
13931+
linkType: hard
13932+
1392613933
"immutable@npm:^3.8.2":
1392713934
version: 3.8.2
1392813935
resolution: "immutable@npm:3.8.2"
@@ -21085,7 +21092,7 @@ fsevents@^1.2.7:
2108521092
languageName: node
2108621093
linkType: hard
2108721094

21088-
"redux-thunk@npm:^2.3.0, redux-thunk@npm:^2.4.0":
21095+
"redux-thunk@npm:^2.3.0":
2108921096
version: 2.4.0
2109021097
resolution: "redux-thunk@npm:2.4.0"
2109121098
peerDependencies:
@@ -21094,6 +21101,15 @@ fsevents@^1.2.7:
2109421101
languageName: node
2109521102
linkType: hard
2109621103

21104+
"redux-thunk@npm:^2.4.1":
21105+
version: 2.4.1
21106+
resolution: "redux-thunk@npm:2.4.1"
21107+
peerDependencies:
21108+
redux: ^4
21109+
checksum: af5abb425fb9dccda02e5f387d6f3003997f62d906542a3d35fc9420088f550dc1a018bdc246c7d23ee852b4d4ab8b5c64c5be426e45a328d791c4586a3c6b6e
21110+
languageName: node
21111+
linkType: hard
21112+
2109721113
"redux@npm:^4.0.0, redux@npm:^4.1.0, redux@npm:^4.1.2":
2109821114
version: 4.1.2
2109921115
resolution: "redux@npm:4.1.2"
@@ -21482,13 +21498,20 @@ fsevents@^1.2.7:
2148221498
languageName: node
2148321499
linkType: hard
2148421500

21485-
"reselect@npm:^4.0.0, reselect@npm:^4.1.2":
21501+
"reselect@npm:^4.0.0":
2148621502
version: 4.1.2
2148721503
resolution: "reselect@npm:4.1.2"
2148821504
checksum: 5a702af37e7fa5e58e8b0787b8a1668df2eff527f1eb2cb2bd81416db6947064a922b41f28a522016df6e5e2dbc5f8588ff0749dcf3c06daae0e0cc3baffec99
2148921505
languageName: node
2149021506
linkType: hard
2149121507

21508+
"reselect@npm:^4.1.5":
21509+
version: 4.1.5
21510+
resolution: "reselect@npm:4.1.5"
21511+
checksum: 54c13c1e795b2ea70cba8384138aebe78adda00cbea303cc94b64da0a70d74c896cc9a03115ae38b8bff990e7a60dcd6452ab68cbec01b0b38c1afda70714cf0
21512+
languageName: node
21513+
linkType: hard
21514+
2149221515
"resolve-cwd@npm:^2.0.0":
2149321516
version: 2.0.0
2149421517
resolution: "resolve-cwd@npm:2.0.0"

0 commit comments

Comments
 (0)