🥊

Reactコンポーネントのasを実装する

に公開

ツールチップなどのライブラリの外部コンポーネントをラップするコンポーネントを作ってたときにvalidateDOMNestingに関するエラーがでて困ってた。

特にコンポーネントをラップするタグに意図はなかったので柔軟なasぽい実装ほしかた

結論

type Props = {
  as?: keyof JSX.IntrinsicElements | React.ComponentType<unknown>;
};

const Container = (props: Props): JSX.Element => {
  const { as: Component = "div", ...rest } = props;
  return <Component {...rest}>{/* some content */}</Component>;
};

ChatGPTさんはもうちょっと複雑な型定義を提案してたけど、これで動きはしそう

補足
creareElement関数でタグを渡す方法も考えたが、ChatGPTさんいわく型推論が聞きづらくなるらしいのでやめた

Discussion