Аргумент типа 'ThunkAction' не может быть назначен параметру типа 'AnyAction' - PullRequest
2 голосов
/ 04 февраля 2020

Я установил избыточную функцию thunk с машинописным текстом следующим образом:

export const fetchActivities = (): AppThunk => async dispatch => {
    dispatch(fetchActivitiesRequest())

    try {
        const res = await fetch("/activities")
        const body = await res.json()

        dispatch(fetchActivitiesSuccess(body))
    } catch (err) {
        dispatch(fetchActivitiesError(err))
    }
}

AppThunk - это просто тип, производный от типа ThunkAction, со следующими параметрами типа:

export type AppThunk<ReturnType = void> = ThunkAction<ReturnType, {}, null, Action<string>>

Моя проблема в том, что, когда я пытаюсь настроить модульный тест для своего действия, и когда я пытаюсь отправить действие thunk следующим образом:

const middlewares = [thunk]
const mockStore = configureMockStore(middlewares)
const store = mockStore({ activities: [] })

store.dispatch(actions.fetchActivities())

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

Argument of type 'ThunkAction<void, {}, null, Action<string>>' is not assignable to parameter of type 'AnyAction'.
  Property 'type' is missing in type 'ThunkAction<void, {}, null, Action<string>>' but required in type 'AnyAction'.ts(2345)

Я пытался найти решение этой проблемы, но безуспешно. Большинство предложений говорят, чтобы попытаться добавить любой параметр к generi c для отправки, поэтому dispatch<any>(actions.fetchActivities()). Несмотря на то, что это работает, чтобы остановить ошибку ввода, будет отправлено только первое действие в thunk, а все внутри операторов try и catch игнорируется.

У кого-нибудь есть предложения относительно того, как решить эту проблему?

1 Ответ

2 голосов
/ 04 февраля 2020

Это две разные проблемы. Печатание любого способа никогда не повлияет на поведение во время выполнения.

Во-первых: ваш отказ, не инициирующий никаких других действий, может иметь только одно значение: другие вызовы dispatch, скорее всего, никогда не будут достигнуты. Вы уверены, что ваш звонок на fetch когда-либо прерывается? Он может просто ждать ответа вечно или что-то в этом роде.

Во-вторых, ваша проблема с печатанием: обычный тип Dispatch просто не поддерживает thunks по умолчанию. Ваше решение с Dispatch<any> в порядке. В противном случае вы можете преобразовать свою функцию dispatch в ThunkDispatch из пакета redux-thunk.

Редактировать: Извините, это просто выглядело точно так же, как ошибка RTK, но это что-то другой. (Оригинал, возможно, неправильный ответ)

Это известная ошибка в RTK с в настоящее время открытым PR , которая исправит это - я не удосужился завершить ее, так как заболел на данный момент, но вы можете использовать сборку CI, пока мы не выпустим новую версию. Вы можете установить его через

yarn add https://pkg.csb.dev/reduxjs/redux-toolkit/commit/933aa4a1/@reduxjs/toolkit или npm i https://pkg.csb.dev/reduxjs/redux-toolkit/commit/933aa4a1/@reduxjs/toolkit

...