【问题标题】:Redux Toolkit - Argument of type 'AsyncThunkAction<>' is not assignable to parameter of type 'AnyAction'Redux Toolkit - 'AsyncThunkAction<>' 类型的参数不可分配给 'AnyAction' 类型的参数
【发布时间】:2021-10-19 01:33:55
【问题描述】:

我正在将我的 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;

useMyDispatch 的类型是useMyDispatch(): Dispatch&lt;AnyAction&gt;

键入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&lt;GETALLPAGESACTION, string, { dispatch: Dispatch&lt;AnyAction&gt;; state: { pages: { pages: null; pagesLoading: boolean; }; }; }&gt;' is not assignable to parameter of type 'AnyAction'.

我知道这个问题已经被问过好几次了,我已经尝试添加这些解决方案,包括尝试控制调度类型的set an explicit middleware type,但都没有奏效。据我所知(我对 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;

我真的可以在这里使用一些帮助,尤其是解释这里出了什么问题以及我应该进一步深入研究以更好地理解这一点。谢谢!

【问题讨论】:

    标签: javascript reactjs redux react-redux redux-toolkit


    【解决方案1】:

    大多数情况下,这只是一个错误,是由 Redux 4.0.5 和 Redux 4.1.0/4.1.1 都安装在您的 node_modules 中的某个位置引起的。

    大多数情况下,这可以通过重新安装react-redux@types/react-redux@reduxjs/toolkit 来解决。

    如果你使用 yarn,你也可以运行yarn why redux,它会列出所有已安装的版本以及安装原因。

    【讨论】:

    • 谢谢!!你说对了,我确实安装了 4.0.5 和 4.1.1,重新安装上述软件包解决了这个问题。
    • 在 github 中是否有关于此的问题? @phry
    • @ChanwooPark 我们会怎么做呢?发布另一个更加混乱的版本?最后,人们永远不应该同时安装同一个库的多个版本,因为这总是会导致 TypeScript 问题,但这是包管理器的问题。我们对此无能为力。
    • @phry 即使只安装了一个“redux”包,还有其他可能的原因吗?使用 redux 版本是 4.1.2
    • @ChanwooPark 如果您没有使用 RTK TypeScript 快速入门文档中推荐的类型化调度钩子或将数组传递到 configureStoremiddlewares,不小心删除了 thunk 中间件。
    猜你喜欢
    • 2022-01-05
    • 2021-11-18
    • 2020-11-13
    • 2020-05-19
    • 1970-01-01
    • 2020-07-18
    • 2019-06-24
    • 2021-06-14
    相关资源
    最近更新 更多