typescript - Next JS Redux Devtools-tillägg fungerar inte
Jag försöker ställa in Redux-Devtools-tillägget för denna enkla NextJS-app med Redux, men konfigurationen fungerar inte. Jag har problem med enhancer och har ingen aning om hur jag ska lösa detta problem.
Jag läste igenom Redux-dokumentationen men kunde inte hitta den information som behövs för att få det att fungera. Någon vägledning kring detta skulle vara till stor hjälp.
VS code-fel jag får är:
Typen '((...args: any[]) => unknown)[]' kan inte tilldelas typen '(getDefaultEnhancers: GetDefaultEnhancers
, UnknownAction>]>>) => Tuple<...>'. Den förväntade typen kommer från egenskapen 'enhancers' som deklareras här på typen 'ConfigureStoreOptions
, UnknownAction, Tuple<[ThunkMiddleware , UnknownAction>]>, Tuple<...>, CombinedState<...>>'
Store.ts
import { configureStore } from "@reduxjs/toolkit";
import { composeWithDevTools } from "@redux-devtools/extension";
import {
TypedUseSelectorHook,
useDispatch as useAppDispatch,
useSelector as useAppSelector,
} from "react-redux";
import { applyMiddleware, compose } from "redux";
import rootReducer from "./rootReducer";
// And use redux-batched-subscribe as an example of adding enhancers
// ----------------------------------------------------------------------
// Define the root state type using the ReturnType utility of TypeScript
export type RootState = ReturnType<typeof rootReducer>;
// Define the type for dispatching actions from the store
export type AppDispatch = typeof store.dispatch;
const composeEnhancers = compose(
applyMiddleware,
composeWithDevTools()
);
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
serializableCheck: false,
immutableCheck: false,
}),
devTools: process.env.NODE_ENV !== 'production',
enhancers: [composeEnhancers],
});
// Extract the dispatch function from the store for convenience
const { dispatch } = store;
const useSelector: TypedUseSelectorHook<RootState> = useAppSelector;
// Create a custom useDispatch hook with typed dispatch
const useDispatch = () => useAppDispatch<AppDispatch>();
// Export the Redux store, dispatch, useSelector,
// and useDispatch for use in components
export { store, dispatch, useSelector, useDispatch };
Svar #1
Att lägga till store-förbättrare fungerar på samma sätt som middleware, du kan tillhandahålla en array av förbättrare (Typescript-användare måste använda ett Tuple) eller använda getDefaultEnhancers-funktionen för att lägga till dem.
import {
configureStore,
applyMiddleware ,
Tuple
} from '@reduxjs/toolkit';
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
serializableCheck: false,
immutableCheck: false,
}),
devTools: process.env.NODE_ENV !== 'production',
enhancers: (getDefaultEnhancers) =>
getDefaultEnhancers()
.concat(/* ...other enhancers */),
});
eller
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
serializableCheck: false,
immutableCheck: false,
}),
devTools: process.env.NODE_ENV !== 'production',
enhancers: () => new Tuple(applyMiddleware, /* ...other enhancers */),
});
Standardförstärkarna inkluderar alltid redan applyMiddleware-förstärkaren baserat på middleware-egenskapen och inkluderar autoBatchEnhancer.
DevTools hanteras separat, så det finns inget behov av att göra något för det i enhancers-egenskapen. devTools är antingen ett booleskt värde eller ett objekt, och standardvärdet är true.
Följande inställning kommer att inaktivera standardkontroller för serialiserbarhet och oföränderlighet, och aktivera utvecklingsverktygen med standardinställningar i icke-produktionsbyggnader.
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
serializableCheck: false,
immutableCheck: false,
}),
devTools: process.env.NODE_ENV !== 'production',
});
Du kan skicka ett objekt för devTools om du vill anpassa dess inställningar.
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
serializableCheck: false,
immutableCheck: false,
}),
devTools: process.env.NODE_ENV !== 'production' && {
maxAge: 100, // default 50
trace: true, // default false
...etc
},
});
