场景:在 TS 组件内使用 react-router-dom 和 forwardRef,向外部提供 interface 时,类型冲突。 方案:利用 HOC 包裹一层,做类型转换。
⚠️ todo
import React, { forwardRef } from 'react';
import type { Ref, ComponentType } from 'react';
import { withRouter } from 'react-router-dom';
import type { RouteComponentProps } from 'react-router-dom';
export const withRouterForwardRef = <ComposedComponentType extends {}>(ComposedComponent) => {
interface WrapperComponentProps {
forwardedRef: Ref<ComposedComponentType>;
}
const WithRouter = withRouter<
RouteComponentProps & WrapperComponentProps,
ComponentType<RouteComponentProps & WrapperComponentProps>
>(({ ...props }) => <ComposedComponent ref={props.forwardedRef} {...props} />);
return forwardRef<ComposedComponentType>((props, ref) => (
<WithRouter {...props} forwardedRef={ref} />
));
};