326 文字
2 分
ReactとTypeScriptでHTML属性を拡張する方法について
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>;};
ReactとTypeScriptでHTML属性を拡張する方法について
https://blog.ohirunewani.com/posts/react-typescript-html-attributes/