Redux dispatch报错:传参/不传参均提示参数数量不符
问题现象
调用Redux Action Creator addDisplate时,无论传不传参数,都会收到矛盾的TypeScript错误:
(alias) addDisplate(payload: Displate): { payload: Displate; type: "shopping cart/addDisplate"; } import addDisplate Calling this redux#ActionCreator with an argument will return a PayloadAction of type T with a payload of P Expected 0 arguments, but got 1.ts(2554) Expected 1 arguments, but got 0.ts(2554) createAction.d.ts(123, 6): An argument for 'payload' was not provided
相关代码片段
Reducer定义
addDisplate: (state, action: PayloadAction<Displate>) => { state.push(action.payload); },
组件调用
dispatch(addDisplate(displate));
导出与导入
导出:
export const { addDisplate } = shoppingCartSlice.actions;
导入:
import { addDisplate } from "../features/shoppingCart/cart-slice";
原因及解决方式
重复定义
Displate接口
你在slice和组件中分别定义了Displate接口,TypeScript会将它们视为两个独立类型,即使结构完全一致。
解决:将Displate接口抽离到单独的公共类型文件(如src/types/displate.ts),在slice和组件中统一导入该文件的接口,避免重复定义。Redux Toolkit类型推导异常
旧版本的@reduxjs/toolkit或typescript可能存在类型推导bug,导致Action Creator的参数类型识别混乱。
解决:升级@reduxjs/toolkit和typescript到最新稳定版本;同时确保createSlice的使用符合规范,RTK会自动根据reducer的action参数推导Action Creator类型,无需手动指定(手动指定时需保证类型完全匹配)。TypeScript语言服务缓存问题
编辑器的TypeScript服务可能缓存了旧的类型信息,导致错误提示矛盾。
解决:重启编辑器,或在VSCode中执行Ctrl+Shift+P->TypeScript: Restart TS Server刷新类型服务。dispatch类型未正确配置
组件中的dispatch若未绑定Redux store的正确类型,会导致对Action Creator的参数校验出错。
解决:在store配置文件中导出专属的dispatch类型,组件中使用useDispatch时指定该类型:// store.ts export type AppDispatch = typeof store.dispatch; // 组件内 import { useDispatch } from 'react-redux'; import type { AppDispatch } from '../../store'; const dispatch = useDispatch<AppDispatch>();
内容的提问来源于stack exchange,提问作者ether

