求助: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
相关产品推荐
相关产品推荐

