From 65902f525b2546cc04636b58930d3c9f34f58c51 Mon Sep 17 00:00:00 2001 From: Nathan Bierema Date: Wed, 22 Feb 2023 09:07:57 -0500 Subject: [PATCH 1/2] Install Redux with PreloadedState generic branch --- packages/toolkit/package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 253d722b4d..37ee801b76 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -118,7 +118,7 @@ ], "dependencies": { "immer": "^9.0.16", - "redux": "5.0.0-alpha.2", + "redux": "Methuselah96/redux#head=preloaded-state-generic-4-with-prepack", "redux-thunk": "3.0.0-alpha.1", "reselect": "^4.1.7" }, diff --git a/yarn.lock b/yarn.lock index 46346bf0df..e965c6e3c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6781,7 +6781,7 @@ __metadata: node-fetch: ^2.6.1 prettier: ^2.2.1 query-string: ^7.0.1 - redux: 5.0.0-alpha.2 + redux: "Methuselah96/redux#head=preloaded-state-generic-4-with-prepack" redux-thunk: 3.0.0-alpha.1 reselect: ^4.1.7 rimraf: ^3.0.2 @@ -24426,10 +24426,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"redux@npm:5.0.0-alpha.2": +"redux@Methuselah96/redux#head=preloaded-state-generic-4-with-prepack": version: 5.0.0-alpha.2 - resolution: "redux@npm:5.0.0-alpha.2" - checksum: fbae31c55bab62a210a5a24a64721f593080fb94808c547b646ddff91515f8ab4e3363af5ece16491f0179d43729fc0350235c9fea7500b37b67d762a55b6945 + resolution: "redux@https://github.com/Methuselah96/redux.git#commit=93ac9dce5af9813460ce8382ddeae6e27d5471a3" + checksum: 3a075f3b267c5831fa054f38d64b50ee426a554b7feaba91c9a9e4ef5c6ab6292a536955f8c656e66f500f87a493a63587317dc4b48ab207c834def0a99ab5d8 languageName: node linkType: hard From 8e2928ca513e5daa07b5ebee24aad994b92d9c52 Mon Sep 17 00:00:00 2001 From: Nathan Bierema Date: Wed, 22 Feb 2023 09:08:22 -0500 Subject: [PATCH 2/2] Update types to work with the PreloadedState generic --- packages/toolkit/src/configureStore.ts | 23 ++++++++++++------- .../src/tests/configureStore.typetest.ts | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/toolkit/src/configureStore.ts b/packages/toolkit/src/configureStore.ts index 76f5a0519c..1eef27002d 100644 --- a/packages/toolkit/src/configureStore.ts +++ b/packages/toolkit/src/configureStore.ts @@ -7,8 +7,6 @@ import type { StoreEnhancer, Store, Dispatch, - PreloadedState, - CombinedState, } from 'redux' import { createStore, compose, applyMiddleware, combineReducers } from 'redux' import type { DevToolsEnhancerOptions as DevToolsOptions } from './devtoolsExtension' @@ -21,7 +19,6 @@ import type { } from './getDefaultMiddleware' import { curryGetDefaultMiddleware } from './getDefaultMiddleware' import type { - NoInfer, ExtractDispatchExtensions, ExtractStoreExtensions, } from './tsHelpers' @@ -45,6 +42,7 @@ export type ConfigureEnhancersCallback = ( export interface ConfigureStoreOptions< S = any, A extends Action = AnyAction, + PreloadedState = S, M extends Middlewares = Middlewares, E extends Enhancers = Enhancers > { @@ -52,7 +50,9 @@ export interface ConfigureStoreOptions< * A single reducer function that will be used as the root reducer, or an * object of slice reducers that will be passed to `combineReducers()`. */ - reducer: Reducer | ReducersMapObject + reducer: + | Reducer + | ReducersMapObject /** * An array of Redux middleware to install. If not supplied, defaults to @@ -87,7 +87,7 @@ export interface ConfigureStoreOptions< As we cannot distinguish between those two cases without adding another generic parameter, we just make the pragmatic assumption that the latter almost never happens. */ - preloadedState?: PreloadedState>> + preloadedState?: PreloadedState /** * The store enhancers to apply. See Redux's `createStore()`. @@ -141,9 +141,12 @@ export type EnhancedStore< export function configureStore< S = any, A extends Action = AnyAction, + PreloadedState = S, M extends Middlewares = [ThunkMiddlewareFor], E extends Enhancers = [StoreEnhancer] ->(options: ConfigureStoreOptions): EnhancedStore { +>( + options: ConfigureStoreOptions +): EnhancedStore { const curriedGetDefaultMiddleware = curryGetDefaultMiddleware() const { @@ -154,12 +157,16 @@ export function configureStore< enhancers = undefined, } = options || {} - let rootReducer: Reducer + let rootReducer: Reducer if (typeof reducer === 'function') { rootReducer = reducer } else if (isPlainObject(reducer)) { - rootReducer = combineReducers(reducer) as unknown as Reducer + rootReducer = combineReducers(reducer) as unknown as Reducer< + S, + A, + PreloadedState + > } else { throw new Error( '"reducer" is a required argument, and must be a function or an object of functions that can be passed to combineReducers' diff --git a/packages/toolkit/src/tests/configureStore.typetest.ts b/packages/toolkit/src/tests/configureStore.typetest.ts index e17095e13f..66671ca7e1 100644 --- a/packages/toolkit/src/tests/configureStore.typetest.ts +++ b/packages/toolkit/src/tests/configureStore.typetest.ts @@ -131,8 +131,8 @@ const _anyMiddleware: any = () => () => () => {} }) configureStore({ - reducer: () => 0, // @ts-expect-error + reducer: (_: number) => 0, preloadedState: 'non-matching state type', }) }