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

求助:Type 'void'无法赋值给WritableDraft<Reminder>[]错误排查

问题原因

你的错误根源在于fetchReminders这个async thunk函数没有正确返回数据,导致它的返回类型变成了void,而extraReducers里的action.payload需要是Reminder[]类型,所以出现类型不兼容的错误。

具体来说,你在async函数里用了await axios.get(...),同时又链式调用了.then()和.catch(),但整个async函数没有return这个axios请求的结果链。async函数如果没有显式return值,默认会返回Promise<void>,这就导致fetchReminders.fulfilled的action payload类型是void,无法赋值给state.reminders(它需要Reminder[])。

修复方案

有两种简洁的修复方式:

方案一:移除await,直接return请求的Promise链

把await去掉,直接return axios.get的整个then/catch链,这样thunk就能正确获取到返回值的类型:

export const fetchReminders = createAsyncThunk("getReminders", () => {
  return axios.get("http://localhost:3000/api/reminders")
  .then((response) => {
    return response.data.reminders;
  })
  .catch((err: Error | AxiosError) => {
    if (axios.isAxiosError(err)) {
      return err.response;
    } else {
      return err;
    }
  });
});

方案二:改用try/catch替代then/catch(更符合async/await的写法)

用try/catch处理错误,这样可以更清晰地使用async/await,同时确保正确return数据:

export const fetchReminders = createAsyncThunk("getReminders", async () => {
  try {
    const response = await axios.get("http://localhost:3000/api/reminders");
    return response.data.reminders;
  } catch (err: unknown) {
    if (axios.isAxiosError(err)) {
      return err.response;
    } else {
      return err as Error;
    }
  }
});

另外注意:你的deleteReminder reducer逻辑存在错误——当前代码是保留id等于action.payload的项,这和“删除”的意图相反,应该改成:

deleteReminder: (state, action: PayloadAction<string>) => {
  state.reminders = state.reminders.filter(
    (reminder) => reminder.id !== action.payload // 这里修改为 !==
  );
},

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:00:19