ReactとTypeScriptでHTML属性を拡張する方法について
ReactとTypeScriptでHTML属性を拡張する方法について書いた。React.ComponentPropsWithoutRefやReact.ComponentPropsWithRef、React.ComponentProps、JSX.IntrinsicElements、React.DetailedHTMLProps、React.ButtonHTMLAttributes、React.HTMLProps、React.AllHTMLAttributes、React.HTMLAttributesなど。
HTML要素の属性は、歴史的な理由などにより様々な記述ができる。
- React.ComponentPropsWithoutRef<“button”>
- 基本的にこれだけ覚えておけばいい。
- React.ComponentPropsに依存。
- React.ComponentPropsWithRef<“button”>
- React.ComponentPropsに依存。
- Ref Forwarding対応をする場合に使用。
- Ref Forwardingより単純にRefを渡す方が基本的に有益なため、あまり使う機会はないかもしれない。
- React.ComponentProps<”button”>
- Forwarded Refかの判別が困難なため、React.ComponentPropsWithoutRefとReact.ComponentPropsWithRefが推奨されている。
- JSX.IntrinsicElementsに依存。
- JSX.IntrinsicElements[“button”]
- React.DetailedHTMLPropsに依存
React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>
- 対応したReact.XXHTMLAttributesに依存
React.ButtonHTMLAttributes<HTMLButtonElement>
- 各属性がベタ書きされている。本質。
React.HTMLProps<HTMLButtonElement>
- React.AllHTMLAttributesに依存
- Isomorphic componentsを雑に作りたい場合など、とりあえずで型を与えたい場合に便利かもしれない…
React.AllHTMLAttributes<HTMLButtonElement>
- React.HTMLAttributesに依存
- その名の通り全ての属性が与えられる。
- 要素によって規約が異なる属性値は丸められている。
- 例えばtypeがstringになる。
React.HTMLAttributes<HTMLButtonElement>
- Aria属性やハンドラーなど、共通して与えられる標準的なHTML属性が定義されている。
- その要素固有の属性が与えられない。
React.ComponentPropsWithoutRefを利用したコンポーネントの例。
interface SomeComponentProps extends React.ComponentPropsWithoutRef<"button"> {
additionalProp?: string;
}
export const SomeComponent = (props: SomeComponentProps) => {
return <button type={props.type}>SomeComponent</button>;
};