🦎
React + TS で動的にタグを変える方法
styled-components の as
みたいなものどうやってやるんだろうと思い調べてみたので共有です。
結論から書くと次のようにすればいけました。
type Props = {
as?: React.ElementType;
text: string;
};
const ReactMozidume: React.VFC<Props> = ({ as: CustomTag = "p", text }) => {
return (
<CustomTag>
{text}
</CustomTag>
);
};
as keyof JSX.IntrinsicElements
のキャストがないと valid な HTML タグかを TS が分からないので
Type '{ children: string; }' has no properties in common with type 'IntrinsicAttributes'.ts(2559)
というエラーを吐いてしまいます。
Discussion
as
の型の部分、string
の代わりにReact.ElementType
とすると、ある程度簡単に限定できると思いますが、いかがでしょうか?そんな便利型が!ありがとうございます!
ElementTypeはIntrinsicElementsを抱えているのでキャストは不要なのではないでしょうか。こんなのでよさそうです:
おお、本当だキャストなくしてもコンパイル通りましたね。
ご指摘ありがとうございます!!