Consider the following code, containing a higher order component, a functional component, and a component created using the HOC and our functional component:
interface InjectedProps {
someProp?: number;
}
const myHoc = <P extends {}>(
Component: ComponentType<P>
) => ({someProp, ...props}: P & InjectedProps) => {
return <Component {...props as P} />;
}
const MyComponent = (props: {children?: React.ReactNode}) => {
return <div>{props.children}</div>;
};
const WrappedComponent = myHoc(MyComponent);
However, when we try and use this new WrappedComponent:
return (
<WrappedComponent>
<h1>Hello</h1>
<h2>World</h2>
</WrappedComponent>
);
We end up with the error: Type '{ children: Element[]; }' has no properties in common with type 'IntrinsicAttributes & InjectedProps'..
This can be solved by injecting the children prop into the props of the HOC, like so;
interface InjectedProps {
someProp?: number;
children?: React.ReactNode;
}
However, we now have the problem of all wrapped components can now take on children, even when they could previously not.
My question is, what is the proper typing for a higher order component which passes down the children in the wrapped component?