场景:在 TS 组件内使用 react-router-dom 和 forwardRef,向外部提供 interface 时,类型冲突。 方案:利用 HOC 包裹一层,做类型转换。

    ⚠️ todo

    1. import React, { forwardRef } from 'react';
    2. import type { Ref, ComponentType } from 'react';
    3. import { withRouter } from 'react-router-dom';
    4. import type { RouteComponentProps } from 'react-router-dom';
    5. export const withRouterForwardRef = <ComposedComponentType extends {}>(ComposedComponent) => {
    6. interface WrapperComponentProps {
    7. forwardedRef: Ref<ComposedComponentType>;
    8. }
    9. const WithRouter = withRouter<
    10. RouteComponentProps & WrapperComponentProps,
    11. ComponentType<RouteComponentProps & WrapperComponentProps>
    12. >(({ ...props }) => <ComposedComponent ref={props.forwardedRef} {...props} />);
    13. return forwardRef<ComposedComponentType>((props, ref) => (
    14. <WithRouter {...props} forwardedRef={ref} />
    15. ));
    16. };