React Function Componentの型について何を使うべきか
ReactのFunction Componentの型は、歴史的な理由などにより様々な記述ができる。React.FunctionComponent、React.FC、React.VFC、(props: SomeComponentProps): JSX.Elementなどがある。
Table of Contents
ReactのFunction Componentの型は、歴史的な理由などにより様々な記述ができる。
- React.FunctionComponent
- React.FC
- FunctionComponentのエイリアス
- React.VFC
- 以前はReact.FCのchildrenを持たないバージョンだったが現在は同じ
- 上の変更に伴い非推奨へ
- ….
- (props: SomeComponentProps): JSX.Element
React.FCはおすすめできない
同様の記述ができる。
interface SomeComponentProps {
value?: string;
}
const SomeComponent: React.FC<SomeComponentProps> = props => {
return <div>Some Component</div>;
};
const SomeComponent = (props: SomeComponentProps): JSX.Element => {
return <div>Some Component</div>;
};
React.FCではpropsにジェネリクスを渡すのが難しい。
const SomeComponent: React.FC<SomeComponentProps> = props => {
return <div>Some Component</div>;
};
Propsへの型付けでは、通常の関数と同様の手段が利用できる。
const checkValidity = <T extends string>(value: T): boolean => {
return true;
};
const SomeComponent = <T extends Record<string, number>>(
props: SomeComponentProps<T>
) => {
return <div>Some Component</div>;
};
以前はReact.FCの場合、誤ってchildrenが混入してしまう問題もあった。
JSXファイルでジェネリクスを使う場合は注意
TSXファイルでジェネリクスを使う場合、ジェネリクスがJSXとして誤認識される場合がある。
export const SomeComponent = <T>(props: SomeComponentProps<T>) => {
return <div>{`${props.value}`}</div>
}
ワークアラウンドとして次のような記述がある。
export const SomeComponent = <T,>(props: SomeComponentProps<T>) => {
return <div>{`${props.value}`}</div>;
};