Я пытался создать усилитель магазина, который добавляет некоторые новые значения в мое корневое состояние. Однако после того, как я обдумал все работы пользовательского энхансера, я получаю неожиданную ключевую ошибку. Я вижу новую часть состояния в devtools, и приложение работает нормально, однако я получаю
Unexpected key "foo" found in previous state received by the reducer.
Expected to find one of the known reducer keys instead: [...]. Unexpected keys will be ignored.
Чего я просто не понимаю. Я попытался поискать, но ни один из постов, которые я нашел, не касался случая пользовательского усилителя магазина.
Вот минимальный код, который воспроизводит указанную ошибку. Я создаю свой магазин следующим образом:
export const store = configureStore({
reducer: mainReducer,
enhancers: [testEnhancer],
});
Где mainReducer — это просто combReducers({ "my slices" }), а все слайсы создаются с помощью createSlice из RTK.
TestEnhancer выглядит так:
type StateExt = { foo: string }
export const testEnhancer: StoreEnhancer<{}, StateExt> = (next: StoreEnhancerStoreCreator): StoreEnhancerStoreCreator<{}, StateExt> => {
return <S, A extends Action = AnyAction>(reducer: Reducer<S, A>, preloadedState?: PreloadedState<S>): Store<S & StateExt, A> => {
const wrappedReducer: Reducer<S & StateExt, A> = (state, action) => {
return { ...reducer(state, action), foo: 'bar' };
};
return next(wrappedReducer, { ...preloadedState, foo: '' });
};
};
На самом деле это поведение, характерное для combineReducers
. Ожидается постоянное сопоставление 1:1 между любыми ключами состояния верхнего уровня и соответствующими редукторами слайсов.
Вам нужно будет как-то настроить собственный редуктор, который справится с этим, или вообще не использовать combineReducers
. (Есть много похожих версий, которые в целом ведут себя одинаково, но без предупреждений.)