【React】ComponentType<T>で汎用コンポーネントを作成する【Typescript】
こんにちは、フリーランスエンジニアの太田雅昭です。
React.ComponentType<T>
React.ComponentType<T>は、T型のPropsを受け取るコンポーネントを表します。例えば、以下のPersonComponentと、PersonComponent2は同じ働きになります。
type Person = {
name: string;
age: number;
}
const PersonComponent = (props: Person) => {
return <>{props.name} {props.age}</>
}
const PersonComponent2: React.ComponentType<Person> = (props) => {
return <>{props.name} {props.age}</>
}
汎用的なComponentを作る
以下のようにして、Person,Book両方のコンポーネントに対応した、汎用的なものを作ることができます。
type Person = {
name: string;
age: number;
}
type Book = {
title: string;
author: string;
}
type ComponentProps<T> = {
item: T;
}
const PersonComponent = (props: ComponentProps<Person>) => {
return <div>{props.item.name} {props.item.age}</div>
}
const BookComponent = (props: ComponentProps<Book>) => {
return <div>{props.item.title} {props.item.author}</div>
}
const FlexibleComponent = <T,>(props: {
Component: React.ComponentType<ComponentProps<T>>;
item: T;
description: string;
}) => {
return <>
<props.Component item={props.item} />
{props.description}
</>
}
export default function Test() {
return <div>
<FlexibleComponent Component={PersonComponent} item={{ name: "太郎", age: 20 }} description="人" />
<FlexibleComponent Component={BookComponent} item={{ title: "吾輩は猫である", author: "夏目漱石" }} description="本" />
</div>
}