我通过在forwardRef调用中添加类型断言来实现它:
export const MyComponent = forwardRef(_MyComponent) as <
T extends ElementType = "div"
>(
props: MyProps<T> & { ref?: React.Ref<Element> }
) => ReactElement | null;
使用方法
<MyComponent
as="label"
htmlFor="caption" // this autocompletes
asdf="" // this gives error
>
Test
</MyComponent>
const MyGrid = ({ rows }: { rows: number }) => (
<div style={{ gridTemplateRows: `repeat(${rows}, 1fr)` }}></div>
);
<MyComponent as={MyGrid} rows={4}>Test</MyComponent>;
编辑
修改
MyProps
所以它适用于HTML元素
type MyProps<T extends ElementType> = {
as?: T;
} & ComponentPropsWithoutRef<T>;