TS2345: аргумент типа AsyncThunkAction<void | AddItem, ItemInput, AsyncThunkConfig>» невозможно назначить параметру типа AnyAction

В моем фрагменте я определил действие следующим образом: https://github.com/jasonabanico/RedGranite/blob/main/src/Client/RedGranite.Client.Web/src/app/containers/ItemPage/itemPageSlice.ts

export const addItem = createAsyncThunk(
    'itemPage/addItem',
    async (itemInput: ItemInput) => {
        return await itemService
            .addItem(itemInput)
            .catch((err: any) => {
                console.info("Error:", err);
            });
    },
)

Я также определил useAppDispatch как: https://github.com/jasonabanico/RedGranite/blob/main/src/Client/RedGranite.Client.Web/src/app/hooks.ts

export const useAppDispatch = () => useDispatch<AppDispatch>();

Я использую оба вышеперечисленных варианта следующим образом: https://github.com/jasonabanico/RedGranite/blob/main/src/Client/RedGranite.Client.Web/src/app/containers/ItemPage/addItemPage.tsx

const dispatch = useAppDispatch();
...
dispatch(addItem(itemInput));

Я получаю следующую ошибку:

TS2345: аргумент типа AsyncThunkAction<void | AddItem, ItemInput, AsyncThunkConfig>» нельзя назначить параметру типа AnyAction. 21 | длинное описание 22 | };

23 | отправка (addItem (itemInput)); | ^^^^^^^^^^^^^^^^^^^ 24 | };

Что не так в моих определениях? Почему я не могу использовать addItem при отправке?

ОБНОВЛЯТЬ:

Код в репозитории обновлен до этого, но возникает та же ошибка.

export const useAppDispatch = useDispatch.withTypes<AppDispatch>();
export const useAppSelector = useSelector.withTypes<RootState>();

ОБНОВЛЯТЬ:

Для тиражирования в Codesandbox.

  • Открыть терминал
  • источник компакт-диска
  • компакт-диск клиент
  • компакт-диск RedGranite.Client.Web
  • установка npm
  • npm запустить сборку
  • см. ошибку сборки
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
107
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Согласно текущей документации кажется, что ваши хуки useAppDispatch и useAppSelector не совсем правильные.

  • Для useSelector это избавляет вас от необходимости каждый раз вводить (state: RootState).

  • Для useDispatch тип Dispatch по умолчанию не знает о переходниках. Чтобы правильно отправить thunk, вам нужно использовать специальный индивидуальный AppDispatch тип из магазина, который включает в себя типы промежуточного программного обеспечения thunk и используйте его с useDispatch. Добавление предварительно набранный крючок useDispatch не позволит вам забыть импортировать AppDispatch там, где это необходимо.

    import { useDispatch, useSelector } from 'react-redux'
    import type { RootState, AppDispatch } from './store'
    
    // Use throughout your app instead of plain `useDispatch` and `useSelector`
    export const useAppDispatch = useDispatch.withTypes<AppDispatch>()
    export const useAppSelector = useSelector.withTypes<RootState>()
    

Обновите файл src/Client/RedGranite.Client.Web/src/app/hooks.ts до текущего предложения:

import { useDispatch, useSelector } from 'react-redux';
import type { RootState, AppDispatch } from './store';

// Use throughout your app instead of plain `useDispatch` and `useSelector`
export const useAppDispatch = useDispatch.withTypes<AppDispatch>();
export const useAppSelector = useSelector.withTypes<RootState>();

Я обновил свои зависимости, чтобы можно было использовать withTypes. Ошибка все еще существует, но сообщение изменилось на: «Аргумент типа AsyncThunkAction<void | AddItem, ItemInput, AsyncThunkConfig>» не может быть назначен параметру типа UnknownAction».

Jonas Arcangel 18.06.2024 14:28

когда я навожу указатель мыши на определение AppDispatch в коде VS, я вижу «type AppDispatch = Dispatch<UnknownAction>»

Jonas Arcangel 18.06.2024 14:52

@JonasArcangel Можете ли вы попытаться создать работающую Codesandbox демо-версию вашего кода внешнего интерфейса, воспроизводящую эту проблему, которую мы могли бы проверить вживую? При необходимости укажите точные этапы воспроизведения.

Drew Reese 21.06.2024 01:27

Это ошибка сборки, поэтому я не могу ее запустить. Я предоставил ссылку на Codesandbox и шаги выше.

Jonas Arcangel 22.06.2024 02:58

Кажется, вы возвращаете неправильные данные в своей функции действия. Поэтому я думаю, что должно быть так:


export const addItem = createAsyncThunk(
  "itemPage/addItem",
  async (itemInput: ItemInput, { rejectWithValue }) => {
    try {
      const data = await itemService.addItem(itemInput);
      return data;
    } catch (error: any) {
      // if there is an error, it would get rejected status in your extraReducer function
      if (error.response.data) return rejectWithValue(error.response.data);
    }
  }
);

Надеюсь, это может быть полезно.

Я все еще получаю ту же ошибку сборки с этим обновлением.

Jonas Arcangel 24.06.2024 08:22

@JonasArcangel, если вы хотите, чтобы ваш проект каким-то образом работал правильно, я могу предоставить другую структуру сокращения.

NIKE 24.06.2024 20:55

Что ты предлагаешь

Jonas Arcangel 25.06.2024 00:29
Ответ принят как подходящий

Наконец-то я нашел причину. Это произошло потому, что вы определили промежуточное программное обеспечение отдельно, введя anystore.ts. Итак, я исправил вашу проблему, изменив ваш файл store.ts следующим образом:

    import {
      configureStore,
      ThunkAction,
      Action
    } from "@reduxjs/toolkit";
    import homePageReducer from "./containers/HomePage/homePageSlice";
    import itemPageReducer from "./containers/ItemPage/itemPageSlice";
    import ReduxLogger from "redux-logger";
    
    export const store = configureStore({
      middleware:(getDefaultMiddleware) =>
        getDefaultMiddleware().concat(ReduxLogger),
      reducer: {
        homePage: homePageReducer,
        itemPage: itemPageReducer,
      },
    });
    
    export type AppDispatch = typeof store.dispatch;
    export type RootState = ReturnType<typeof store.getState>;
    export type AppThunk<ReturnType = void> = ThunkAction<
      ReturnType,
      RootState,
      unknown,
      Action<string>
    >;

Тип AppDispatch должен был быть ThunkDispatch<any, undefined, UnknownAction> & Dispatch<UnknownAction>, но это был просто Dispatch<UnknownAction>. Так что это не сработало. Это из-за типа getDefaultMiddleware было any.

Другие вопросы по теме