Redux 工具包 - 'AsyncThunkAction<>' 类型的参数不可分配给 'AnyAction' 类型的参数
Redux Toolkit - Argument of type 'AsyncThunkAction<>' is not assignable to parameter of type 'AnyAction'
我正在将我的 React / Redux 应用程序迁移到 Redux 工具包,并按照给出的说明进行操作 here。
我的自定义选择器和调度,根据 documentation。
import { TypedUseSelectorHook, useDispatch, useSelector } from "react-redux";
import { AppDispatch, RootState } from "@/index";
export const useMyDispatch = () => useDispatch<AppDispatch>();
export const useMySelector: TypedUseSelectorHook<RootState> = useSelector;
使用类型MyDispatch 是useMyDispatch(): Dispatch<AnyAction>
类型GETALLPAGESACTION
是
export type GETALLPAGESACTION = {
pagesLoading?: boolean;
pages?: PageType[] | null;
error?: Error | null;
}
这是我最基本的操作:
export const getAllPages = createAsyncThunk<GETALLPAGESACTION,
string,
{ dispatch: AppDispatch; state: RootState; }>("pages/getAllPages",
async () => {
const pagesRes = await axios.get("___");
if (pagesRes) {
const finalPages: PageType[] = [];
pagesRes.data.forEach((page: PageType) => {
finalPages.push(page);
});
return { pages: finalPages, pagesLoading: false };
}
return { pages: [], pagesLoading: false };
});
我的店铺很简单:
const appStore = configureStore({
reducer: {
pages: PagesReducer, // pagesSlice.reducer is default export
},
});
export type RootState = ReturnType<typeof appStore.getState>;
export type AppDispatch = typeof appStore.dispatch;
但是当我尝试在我的组件中使用 getAllPages
时,出现了上述错误。
useEffect(() => {
dispatch(getAllPages()); // Error here
}, []);
Argument of type 'AsyncThunkAction<GETALLPAGESACTION, string, { dispatch: Dispatch<AnyAction>; state: { pages: { pages: null; pagesLoading: boolean; }; }; }>' is not assignable to parameter of type 'AnyAction'.
我知道这个问题已经被问过好几次了,我已经尝试添加这些解决方案,包括尝试 set an explicit middleware type,它控制调度类型,但是 none 已经奏效了。据我所知(我对 Typescript 比较陌生),这里没有正确推断调度类型?
这是我的切片
export const pagesSlice = createSlice({
name: "pages",
initialState,
reducers: {},
extraReducers: {
[getAllPages.pending]: (state, action: PayloadAction<GETALLPAGESACTION>) => {
state.pagesLoading = true;
},
[getAllPages.fulfilled]: (state, action: PayloadAction<GETALLPAGESACTION>) => {
state.pages = action.payload.pages;
state.pagesLoading = false;
},
[getAllPages.rejected]: (state, action: PayloadAction<GETALLPAGESACTION>) => {
state.pagesLoading = false;
},
},
});
export default pagesSlice.reducer;
我真的可以在这里得到一些帮助,尤其是解释这里出了什么问题,以及我应该进一步深入研究什么以更好地理解这一点。谢谢!
大多数时候这只是一个错误,由 Redux 4.0.5 和 Redux 4.1.0/4.1.1 都安装在您的 node_modules
.
中引起
大多数情况下,这可以通过重新安装 react-redux
、@types/react-redux
和 @reduxjs/toolkit
来解决。
如果您使用的是 yarn,您也可以 运行 yarn why redux
它会列出所有已安装的版本以及安装它们的原因。
我正在将我的 React / Redux 应用程序迁移到 Redux 工具包,并按照给出的说明进行操作 here。
我的自定义选择器和调度,根据 documentation。
import { TypedUseSelectorHook, useDispatch, useSelector } from "react-redux";
import { AppDispatch, RootState } from "@/index";
export const useMyDispatch = () => useDispatch<AppDispatch>();
export const useMySelector: TypedUseSelectorHook<RootState> = useSelector;
使用类型MyDispatch 是useMyDispatch(): Dispatch<AnyAction>
类型GETALLPAGESACTION
是
export type GETALLPAGESACTION = {
pagesLoading?: boolean;
pages?: PageType[] | null;
error?: Error | null;
}
这是我最基本的操作:
export const getAllPages = createAsyncThunk<GETALLPAGESACTION,
string,
{ dispatch: AppDispatch; state: RootState; }>("pages/getAllPages",
async () => {
const pagesRes = await axios.get("___");
if (pagesRes) {
const finalPages: PageType[] = [];
pagesRes.data.forEach((page: PageType) => {
finalPages.push(page);
});
return { pages: finalPages, pagesLoading: false };
}
return { pages: [], pagesLoading: false };
});
我的店铺很简单:
const appStore = configureStore({
reducer: {
pages: PagesReducer, // pagesSlice.reducer is default export
},
});
export type RootState = ReturnType<typeof appStore.getState>;
export type AppDispatch = typeof appStore.dispatch;
但是当我尝试在我的组件中使用 getAllPages
时,出现了上述错误。
useEffect(() => {
dispatch(getAllPages()); // Error here
}, []);
Argument of type 'AsyncThunkAction<GETALLPAGESACTION, string, { dispatch: Dispatch<AnyAction>; state: { pages: { pages: null; pagesLoading: boolean; }; }; }>' is not assignable to parameter of type 'AnyAction'.
我知道这个问题已经被问过好几次了,我已经尝试添加这些解决方案,包括尝试 set an explicit middleware type,它控制调度类型,但是 none 已经奏效了。据我所知(我对 Typescript 比较陌生),这里没有正确推断调度类型?
这是我的切片
export const pagesSlice = createSlice({
name: "pages",
initialState,
reducers: {},
extraReducers: {
[getAllPages.pending]: (state, action: PayloadAction<GETALLPAGESACTION>) => {
state.pagesLoading = true;
},
[getAllPages.fulfilled]: (state, action: PayloadAction<GETALLPAGESACTION>) => {
state.pages = action.payload.pages;
state.pagesLoading = false;
},
[getAllPages.rejected]: (state, action: PayloadAction<GETALLPAGESACTION>) => {
state.pagesLoading = false;
},
},
});
export default pagesSlice.reducer;
我真的可以在这里得到一些帮助,尤其是解释这里出了什么问题,以及我应该进一步深入研究什么以更好地理解这一点。谢谢!
大多数时候这只是一个错误,由 Redux 4.0.5 和 Redux 4.1.0/4.1.1 都安装在您的 node_modules
.
大多数情况下,这可以通过重新安装 react-redux
、@types/react-redux
和 @reduxjs/toolkit
来解决。
如果您使用的是 yarn,您也可以 运行 yarn why redux
它会列出所有已安装的版本以及安装它们的原因。