import {Component, cloneElement} from 'react'; import type {ReactElement, ReactNode} from 'react'; interface State { props?: Partial; error?: Error; } interface Props { children?: ReactNode; render?(element: ReactElement): ReactElement; } const defaultRender: NonNullable['render']> = (element) => element; export class TestRenderer extends Component< Props, State > { static getDerivedStateFromError(error: any) { return {error}; } state: State = {}; setProps(props: Partial) { this.setState({props}); } getError() { return this.state.error; } render() { const {props, error} = this.state; if (error) return null; const {children, render = defaultRender} = this.props; return render( props ? (cloneElement(children as any, props) as any) : children!, ); } }