Повторное использование универсальных типов расширенного интерфейса при создании сокращенного типа - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь создать сокращенный тип для своих действий, которые работают с AsyncActionCreators объектами.

Я создал простую функцию, которая принимает параметр React dispatch: Dispatch<T>:

const fetchProfileAction = actionCreator.async<void, Profile, any>('FETCH_PROFILE');
// AsyncActionCreators<Params = void, Result = Profile, Error = any>;


type AsyncDispatch<A extends AsyncActionCreators<Params, Result, Error>, Params, Result, Error> = Dispatch<
  ReturnType<A['started'] | A['done'] | A['failed']>
>;

export const fetchProfile = (
  dispatch: AsyncDispatch<typeof fetchProfileAction, void, Profile, any>,
) => async () => {
  dispatch(fetchProfileAction.started());

  try {
    dispatch(fetchProfileAction.done({ result: (await api.get<Profile>('/profile')).data }));
  } catch (e) {
    dispatch(fetchProfileAction.failed(e));
  }
};

На данный момент проблема в том, что я должен вручную указать типы, используемые в fetchProfileAction:

AsyncDispatch<typeof fetchProfileAction, void, Profile, any>

Можно ли упростить это и получить что-то вроде AsyncDispatch<typeof fetchProfileAction> с автоматически разрешенными Params, Result, Error типами AsyncActionCreators?

1 Ответ

1 голос
/ 15 апреля 2019

Вы можете использовать вывод типа в условных типах :

type AsyncDispatch<A> = A extends AsyncActionCreators<infer Params, infer Result, infer Error>
    ? Dispatch<ReturnType<A['started'] | A['done'] | A['failed']>>
    : never;
...