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

如何为含error成员的Reducer Action指定类型?报错求解

解决Redux Toolkit中PayloadAction带error的类型报错问题

报错原因

你定义的PayloadAction<void, string, never, Error>将error设为了必填属性,但createSlice自动生成的cancelLogin action creator默认不会给action添加error字段,导致TypeScript检测到类型不兼容,抛出error属性缺失的报错。

解决方案

方案1:将error设为可选类型(推荐)

把泛型第四个参数改为Error | undefined,让action允许存在或不存在error字段:

const reducer = createSlice({
  name: 'login',
  initialState,
  reducers: {
    cancelLogin: (state, action: PayloadAction<void, string, never, Error | undefined>) => {
      state.loggingIn = false;
      // 使用前先判断error是否存在
      if (action.error) {
        console.info(action.error.message);
      }
    }
  }
});

方案2:使用prepare函数强制生成带error的action

如果业务要求每次触发cancelLogin都必须携带error,需要通过prepare函数手动构造包含error的action,让TypeScript正确推断类型:

const reducer = createSlice({
  name: 'login',
  initialState,
  reducers: {
    cancelLogin: {
      // 处理state的reducer逻辑
      reducer: (state, action: PayloadAction<void, string, never, Error>) => {
        state.loggingIn = false;
        console.info(action.error.message);
      },
      // 自定义action的生成逻辑,强制传入error
      prepare: (error: Error) => {
        return {
          payload: undefined, // 对应PayloadAction的void类型payload
          error: error
        };
      }
    }
  }
});

调用该action时需要传入Error对象:

reducer.actions.cancelLogin(new Error('登录操作取消'));

内容的提问来源于stack exchange,提问作者challet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:39:59