typescript - 如何将使用 typesafe-actions createAsyncAction 创建的操作传递给生成具有正确类型的 redux-observable 史诗的函数?

标签 typescript redux react-redux redux-observable

我在思考如何在保留键入信息的同时传递通过 CreateAsyncAction 创建的 AsyncAction 时遇到了一些麻烦,例如在我的例子中,我正在尝试使用 ApolloClient 创建一个通用的 GraphQL 查询史诗,因为所有这些都将具有相同的请求/成功/失败流程:

asyncAction 应该是什么类型才能正确解析 isActionOf 和 action.Payload?

const createAsyncEpic = (asyncAction: <type?>, mutation: any) {
    const epic: Epic<RootAction, RootState> = (action$, state$) =>
        action$.pipe(
            filter(isActionOf(actions.request)),
            withLatestFrom(state$),
            mergeMap(([action, state]) =>
                client
                    .mutate({ mutation, variables: { ...action.payload } })
                    .then((result: ApolloQueryResult<P2>) => {
                        return actions.success(result.data);
                    })
                    .catch((error: ApolloError) => {
                        return actions.failure(error);
                    })
           )
       );
    return epic;
};

谢谢!

最佳答案

typesafe-actions@4.3.0 中,我们添加了对使用 AsyncActionCreator 类型为异步操作创建显式类型的支持。

这是文档:https://github.com/piotrwitek/typesafe-actions#asyncactioncreator

在您的情况下,您可以尝试使用类似这样的方法从传递的异步操作 arg 中推断类型:

const createAsyncEpic = <TRequestType extends string, TRequestPayload, TSuccessType extends string, TSuccessPayload, TFailureType extends string, TFailurePayload>(
  asyncAction: AsyncActionCreator<
    [TRequestType, TRequestPayload],
    [TSuccessType, TSuccessPayload],
    [TFailureType, TFailurePayload],
  >,
  mutation: any
) {
...

关于typescript - 如何将使用 typesafe-actions createAsyncAction 创建的操作传递给生成具有正确类型的 redux-observable 史诗的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50546844/

相关文章:

angular - 在 Angular 中刷新 owl-carousel

javascript - 从 .map() 方法内的调度函数返回 promise

javascript - 如果initialState 将有一个对象响应数组,它应该初始化为 null 还是空数组?

reactjs - TypeScript 错误类型 '{}' 缺少类型中的以下属性

reactjs - 使用 React-Sparklines 时, super 表达式必须为 null 或函数,不能为未定义

typescript - Typescript 中错误的自动返回类型推导

javascript - Angular 5 : how to make dynamically created components draggable with jsPlumb?

amazon-web-services - AWS Lambda SNS 触发事件类型?

reactjs - TypeError : TypeError: (0, _reactRedux.useSelector) 不是函数

javascript - 如何从外部 sagas.js 调用 saga?