redux 类型'ThunkAction'的参数无法指派给类型'AnyAction'的参数

rbl8hiat  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(345)

我已经用下面的打字脚本设置了一个redux 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)

我试着寻找这个问题的解决方案,但是没有成功。大多数建议都是尝试在泛型中添加any参数以进行调度,因此dispatch<any>(actions.fetchActivities())。虽然这可以阻止键入错误,但是只有thunk中的第一个操作会被调度,而try和catch语句中的所有内容都会被忽略。
有人对如何解决此问题有什么建议吗?

xe55xuns

xe55xuns1#

这是两个截然不同的问题。任何类型的输入都不会影响运行时的行为。
第一:所以你的thunk不触发任何其他动作只能有一个意思:对dispatch的其他呼叫很可能永远都无法接通。您确定您对fetch的呼叫永远都会终止吗?它可能永远等待应答或类似的情况。
其次,你的打字问题:一般的Dispatch类型默认不支持thunk。您的Dispatch<any>解决方案是可以的。否则,您可以将dispatch函数从redux-thunk包转换为ThunkDispatch
编辑:对不起,这只是 * 看起来 * 完全一样的RTK错误,但它是不同的东西。(原始,可能是错误的答案)
这是RTK中的一个已知错误,可以使用currently open PR来修复它--我没有时间来完成它,因为我现在生病了,但是你可以使用CI build,直到我们推出一个新版本。你可以通过
yarn add https://pkg.csb.dev/reduxjs/redux-toolkit/commit/933aa4a1/@reduxjs/toolkitnpm i https://pkg.csb.dev/reduxjs/redux-toolkit/commit/933aa4a1/@reduxjs/toolkit

vql8enpb

vql8enpb2#

将中间件= [thunk]更改为中间件=获取默认中间件=〉获取默认中间件()

相关问题