Как передать действия, созданные с помощью typesafe-actions createAsyncAction, в функцию, которая генерирует наблюдаемые редуксом эпики с правильными типами? - PullRequest
0 голосов
/ 26 мая 2018

У меня возникли проблемы, когда я не могу понять, как передать AsyncAction, созданную с помощью CreateAsyncAction, с сохранением информации о типизации, например, в моем случае я пытаюсь создать универсальную эпопею запроса GraphQL с использованием ApolloClient, поскольку все они будут иметьтот же поток REQUEST / SUCCESS / FAILURE:

Каким должен быть тип 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;
};

Спасибо!

1 Ответ

0 голосов
/ 15 мая 2019

В 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
) {
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...