Уважаемый TypeScript-3-Гуру,
Может ли кто-нибудь помочь мне определить универсальный тип GuruMagic<T>
, который выполняет следующие действия?
T
- это функция, возвращающая функцию, например, это:
fetchUser(id: Id) => (dispatch: Dispatch) => Promise<boolean>
Общий тип должен затем заменить ReturnType
из fetchUser
на ReturnType
возвращаемой функции. Как это:
type dispatchedAction = GuruMagic<typeof fetchUser>;
// so that dispatchedAction === (id: Id) => Promise<boolean>
Я знаю, что могу применить ReturnType
два раза, чтобы получить Promise<boolean>
, но я не знаю, как объединить исходные параметры (возможно, несколько) с этим типом возврата. Это возможно даже с TypeScript (3.x)?
Другие примеры для наглядности
const f1 = (a: number, b: string) => () => a;
type guruF1 = GuruMagic<typeof f1>; // (a: number, b: string) => number
const f2 = () => (name: string) => (otherName: string) => name + otherName;
type guruF2 = GuruMagic<typeof f2>; // () => (otherName: string) => string
Мотивация
Typesafe Redux-Thunk
. Когда я connect
a react
компонент, было бы здорово, если бы я мог просто сделать это:
import { fetchUser } from './myActions';
interface IPropsOfMyComponent {
fetchUser: GuruMagic<typeof fetchUser>;
}
// ... MyComponent Definition ...
connect<{}, IPropsOfMyComponent, {}>(null, { fetchUser })(MyComponent)