#reactjs #redux #redux-thunk #redux-toolkit
#reactjs ( реакция ) #переопределение #переопределение-инструментарий #reactjs #redux-thunk #redux-toolkit
Вопрос:
Кажется, я не могу получить функцию Promise
from createAsyncThunk
от Redux-toolkit
Я довольно новичок в Typescript, и я изо всех сил пытаюсь понять, почему это выдает мне Property 'then' does not exist on type 'AsyncThunkAction<Student, number, {}>'
ошибку, хотя обещание возвращается, если я удаляю ввод. Вот мой createAsyncThunk
f-n
export const getStudentByIdRequest = createAsyncThunk<Student, number>(
'student/getStudentByIdRequest',
async (id, { rejectWithValue }) => {
try {
const { data } = await instance.get(`student/${id}/`)
return data
} catch (err) {
let error: AxiosError = err
if (error) {
return rejectWithValue({
message: `Error. Error code ${error.response?.status}`,
})
}
throw err
}
}
)
И вот как я отправляю его из своего React
компонента
dispatch(getStudentByIdRequest(userId)).then((res) => console.log(res))
Ошибка появляется там, где я пытаюсь вызвать then
на thunk
Ответ №1:
Ваш dispatch
не учитывает типы для thunks и, следовательно, возвращаемый тип введен неправильно. Пожалуйста, используйте фактический Dispatch
тип из хранилища, как описано в документации:
import { configureStore } from '@reduxjs/toolkit'
import { useDispatch } from 'react-redux'
import rootReducer from './rootReducer'
const store = configureStore({
reducer: rootReducer
})
export type AppDispatch = typeof store.dispatch
export const useAppDispatch = () => useDispatch<AppDispatch>() // Export a hook that can be reused to resolve types
а затем используйте useAppDispatch
вместо useDispatch
в вашем компоненте.
Комментарии:
1. Я сделал это, и мне также пришлось изменить
middleware: [thunk] as const
наmiddleware: getDefaultMiddleware()
вconfigureStore
функции, и теперь я получаю сообщение об ошибке ` ReferenceError: не удается получить доступ к ‘userReducer’ перед инициализацией ` Именно из-за этой ошибки я отказался от использованияuseAppDispatch
в первую очередь2. Неважно, я решил это, переместив мою
Axios
функцию перехватчика изapiConfig.ts
файла вindex.ts
, как предложено здесь github.com/reduxjs/redux-toolkit/issues/… Спасибо за вашу помощь!
Ответ №2:
Другим потенциальным решением для этого может быть использование ThunkDispatch
type вместо plain Dispatch
, поскольку plain Dispatch
не предназначен для обработки асинхронных данных.
Определение многоразового useAppThunkDispatch
крючка в магазине.ts:
import { Action, ThunkDispatch, configureStore } from '@reduxjs/toolkit';
export const store = configureStore({
reducer: {
blog: blogSlice,
},
});
export type RootState = ReturnType<typeof store.getState>;
export type ThunkAppDispatch = ThunkDispatch<RootState, void, Action>;
export const useAppThunkDispatch = () => useDispatch<ThunkAppDispatch>();
Затем вы можете использовать useAppThunkDispatch
hook в своем приложении так же, как useAppDispatch
или useDispatch
hook.
Ответ №3:
Проблема, с которой я столкнулся, была очень похожа на эту, я работал над чем-то, основанным на документации Redux Toolkit, и следующее просто не сработало:
let dispatch = useDispatch()
Дело в том, что в руководстве используется useDispatch() для персонализированного хука, который экспортируется как useAppDispatch()
import { useAppDispatch } from "app/hooks";
Если вы используете правильный импорт и типы, вы сможете решить эту проблему.