Как использовать HOC с приставкой compose и Typescript
У меня есть два HOC, которые хотят использовать с избыточным составлением, но компилятор не делает правильный тип. Compose объявляет функцию из исходного кода. Если мы вставим код на детской площадке. Мы увидим разные типы первой и второй переменных.
type Func1<T1, R> = (a1: T1) => R
type Component<Props> = (props: Props) => string;
declare function compose<T1, A, R>(
f1: (b: A) => R,
f2: Func1<T1, A>
): Func1<T1, R>
declare const HOC1: <Props>(component: Component<Props>)
=> Component<Props & { prop: string }>
declare const HOC2: <Props>(component: Component<Props>)
=> Component<Props & { prop: number }>
declare const component: Component<{props: boolean}>
const first = HOC1(HOC2(component));
const second = compose(HOC1, HOC2)(component);
1 ответ
Решение
Мы не можем смоделировать хорошую версию 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; }>