如何解决useReducer钩子出现「参数不能分配给never类型参数」类型错误
问题原因
你当前的reducer函数入参结构不符合React useReducer 的标准类型要求:useReducer 要求接收的reducer函数签名为 (state: State, action: Action) => State,即两个独立入参,第一个为当前状态值,第二个为操作动作。你将state和action封装到了同一个对象作为reducer的唯一入参,导致TS无法匹配正确的reducer类型,泛型推断失效后初始值todos就被判定为never类型。
另外你当前的reducer直接修改原state数组(push/splice/直接赋值),不符合纯函数要求,可能会导致状态更新不生效的问题,也需要一并修正。
修复代码
1. 修正reducer函数入参结构和纯函数逻辑
interface TodoState { id: string; } interface TodoAction { type?: 'CREATED' | 'DELETED' | 'UPDATED'; payload?: TodoState; } interface TodosProviderProps { children: React.ReactNode; // 补充:ReactChildren已废弃,建议用ReactNode todos: TodoState[]; } // 修正reducer入参为两个独立参数,改为纯函数返回新数组 const reducer = (state: TodoState[] = [], action: TodoAction): TodoState[] => { const { payload, type } = action; const mutatedItem = payload; if (!mutatedItem) { return [...state]; } const mutatedIndex = state.findIndex((item) => item.id === mutatedItem.id); switch (type) { case 'CREATED': if (mutatedIndex < 0) { return [...state, mutatedItem]; } return state; case 'DELETED': if (mutatedIndex >= 0) { return state.filter((_, index) => index !== mutatedIndex); } return state; case 'UPDATED': if (mutatedIndex >= 0) { return state.map((item, index) => index === mutatedIndex ? mutatedItem : item); } return state; default: return state; } };
2. 可选:手动指定useReducer泛型(如果TS自动推断仍有问题)
export function TodosProvider({ children, todos }: TodosProviderProps) { // 手动传入泛型确保类型匹配 const [state, dispatch] = useReducer<React.Reducer<TodoState[], TodoAction>>(reducer, todos); // 剩余代码 }
内容的提问来源于stack exchange,提问作者MiletX
相关产品推荐
相关产品推荐

