Я конвертирую приложение React в Typescript, который использует множество шаблонов функционального программирования. Самым важным из этих шаблонов является способность объединять несколько компонентов более высокого порядка, чтобы получить расширенный компонент. Я хочу, чтобы Typescript выводил типы компонентов на каждом уровне и заканчивал компонентом, который я передаю, чтобы все типы HOC выше него.
Я пробовал этот код на3.5.0 и последняя версия Typescript. Что касается кода, я попытался сделать универсальное расширение нужных типов <T extends FooProps>
, передав FC<T & BarProps>
возвращаемому функциональному компоненту и стравливая вызовы HOC.
export const withFoo = <T>(Component: FC<T & FooProps>): FC<Omit<T, 'foo'>> => props => (
<Component {...props as T} foo="foo" />
)
export const withBar = <T>(Component: FC<T & BarProps>): FC<Omit<T, 'bar'>> => props => (
<Component {...props as T} bar="bar" />
)
export const EnhancedComponent = withFoo(
withBar(({ bar, foo }) => { // bar exists and foo does not exist on type 'PropsWithChildren<BarProps>'
console.log(bar) // types come through (bar: string)
console.log(foo) // types don't come through (foo: any) :(
return <div>woohoo</div>
}),
)
Я хочу типыпройти на каждом уровне HOC. В приведенном выше примере я хочу увидеть это в функциональном компоненте, который я передаю:
export const EnhancedComponent = withFoo(
withBar(({ bar, foo }) => { // both exist on the component
console.log(bar) // bar: string
console.log(foo) // foo: string
return <div>woohoo</div>
}),
)