import React, {ComponentType} from 'react'; import hoistStatics from 'hoist-non-react-statics'; export type ReactComponent

= ComponentType

; export type ComponentClass = React.ComponentClass; export type WrappingFunction = ( Component: ReactComponent, ) => ReactComponent; export default function compose( ...wrappingFunctions: WrappingFunction[] ) { return function wrapComponent( OriginalComponent: ReactComponent & C, ): ReactComponent & C { let result: ReactComponent; if (wrappingFunctions.length === 0) { result = OriginalComponent; } else { result = wrappingFunctions.reduce( (wrappingFunctionA, wrappingFunctionB) => { return (WrappingComponent: ReactComponent) => wrappingFunctionA(wrappingFunctionB(WrappingComponent)); }, )(OriginalComponent); } return hoistStatics( result as ComponentClass, OriginalComponent as ComponentClass, ) as ReactComponent & C; }; }