You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 06:24:03