NextJS/TS项目中createSlice.extraReducers迁移至builder回调写法报错求助
解决Redux Toolkit
extraReducers builder写法的HYDRATE类型错误 错误根源
next-redux-wrapper提供的HYDRATE动作默认类型未包含payload,但你的代码中需要访问action.payload,导致TypeScript类型不匹配;同时代码中存在空的.addCase()调用,属于无效语法。
修复步骤
1. 明确HYDRATE动作的payload结构
HYDRATE的payload是整个Redux store的完整状态,你需要从payload中提取当前slice对应的状态分支(假设你的slice名称为auth)。
2. 正确编写builder回调
以下两种方式任选其一,均可解决类型匹配问题:
方式一:直接指定action类型
import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { HYDRATE } from 'next-redux-wrapper'; import { AuthState } from './your-auth-state-path'; const initialState: AuthState = { loggedIn: false, userId: '', role: '', accessToken: '', refreshToken: '' }; const authSlice = createSlice({ name: 'auth', initialState, reducers: { // 你的自定义reducer逻辑 }, extraReducers: (builder) => { builder.addCase(HYDRATE, (state, action: PayloadAction<{ auth: AuthState }>) => { return { ...state, ...action.payload.auth }; }); // 删除之前的空.addCase()调用,或添加其他有效的case逻辑 } }); export default authSlice.reducer;
方式二:使用addMatcher做类型守卫
如果需要更严格的类型检查,可先定义HYDRATE动作的类型,再通过addMatcher匹配:
import { createSlice, Action } from '@reduxjs/toolkit'; import { HYDRATE } from 'next-redux-wrapper'; import { AuthState } from './your-auth-state-path'; // 扩展HYDRATE动作类型,添加payload定义 interface HydrateAction extends Action<typeof HYDRATE> { payload: { auth: AuthState; }; } const initialState: AuthState = { loggedIn: false, userId: '', role: '', accessToken: '', refreshToken: '' }; const authSlice = createSlice({ name: 'auth', initialState, reducers: { // 你的自定义reducer逻辑 }, extraReducers: (builder) => { builder.addMatcher( (action): action is HydrateAction => action.type === HYDRATE, (state, action) => { return { ...state, ...action.payload.auth }; } ); } }); export default authSlice.reducer;
3. 关键注意事项
- 确保
action.payload的键名与你的slice名称一致(比如slice叫auth,就取action.payload.auth),否则会取不到正确的状态分支。 - 必须移除代码中空的
.addCase()调用,避免语法和类型错误。
内容的提问来源于stack exchange,提问作者Amir Bravostack
相关产品推荐
相关产品推荐

