Мы не можем смоделировать хорошую версию compose в текущей системе типов машинописи.Нет возможности записать параметры универсального типа в HOC.
Мы можем создать версию, которая могла бы работать при некоторых обстоятельствах, основываясь на том, как стираются параметры типа (в основном они просто заменяются на самый узкий тип в этом случае {}
).Это означает, что мы можем получить реквизит, добавленный HOC.Я не знаю, насколько хорошо это будет работать, но это работает для вашего образца:
type Func1<T1, R> = (a1: T1) => R
type Component<Props> = (props: Props) => string;
declare function compose<A, R, R2>(f1: (b: A) => Component<R>,f2: (b: A) => Component<R2>,): (<P>(c: Component<P>) => Component<P & R & R2>)
declare const HOC1: <Props>(component: Component<Props>)
=> Component<Props & { prop1: string }>
declare const HOC2: <Props>(component: Component<Props>)
=> Component<Props & { prop2: number }>
declare const component: Component<{props3: boolean}>
const a = HOC1(HOC2(component));
const b = compose(HOC1, HOC2)(component); //Component<{ props3: boolean; } & { prop1: string; } & { prop2: number; }>
ссылка на игровую площадку