ReactとTypeScriptの基本:childrenを型定義する方法を徹底解説!初心者向け入門ガイド
生徒
「先生、Reactでchildrenってよく出てくるんですが、これは何ですか?」
先生
「childrenは、コンポーネントの中に挟み込んだ要素を受け取るための特別なPropsなんだ。TypeScriptを使うと、このchildrenにもしっかり型をつけることができるんだよ。」
生徒
「なるほど!でも具体的にどうやって型を定義するんですか?」
先生
「それじゃあ、実際にTypeScriptでchildrenを型定義する方法を一緒に見ていこう!」
1. childrenとは?
Reactのchildrenとは、コンポーネントの開始タグと終了タグの間に書いた要素のことです。たとえばHTMLでいうと、<div>タグの中にテキストや画像を入れるのと同じように、Reactでもコンポーネントの中に別の要素を入れることができます。
イメージとしては「お弁当箱におかずを詰める」ようなものです。箱がコンポーネントで、中に入れるおかずがchildrenです。
2. 型をつけない場合のchildren
まずは型をつけずにchildrenを受け取るシンプルな例を見てみましょう。
import React from "react";
const Box = ({ children }) => {
return <div style={{ border: "1px solid black", padding: "10px" }}>{children}</div>;
};
export default Box;
型をつけない場合でも動作はしますが、TypeScriptのメリットである型安全性を活かせません。そこでchildrenに型をつける方法が役立ちます。
3. TypeScriptでchildrenを型定義する方法
もっとも基本的な方法は、React.ReactNode型を使う方法です。ReactNodeとは、Reactで表示できるすべての要素(文字列・数値・React要素・配列など)を含む便利な型です。
import React, { ReactNode } from "react";
interface BoxProps {
children: ReactNode;
}
const Box = ({ children }: BoxProps) => {
return <div style={{ border: "1px solid black", padding: "10px" }}>{children}</div>;
};
export default Box;
この書き方はもっとも広く使われる方法で、初心者でも安心して使えます。
4. 特定の型に限定したchildren
場合によってはchildrenに文字列だけを許可したいこともあります。その場合はstring型を指定します。
interface TextOnlyProps {
children: string;
}
const TextOnly = ({ children }: TextOnlyProps) => {
return <p>{children}</p>;
};
このように型を限定することで、意図しない使い方を防ぐことができます。
5. ReactElementを使う方法
もしchildrenに特定のReact要素しか受け取りたくない場合は、ReactElement型を使います。ReactElementとは「Reactで描画できる単一の要素」を意味します。
import { ReactElement } from "react";
interface WrapperProps {
children: ReactElement;
}
const Wrapper = ({ children }: WrapperProps) => {
return <div className="wrapper">{children}</div>;
};
この方法は、必ずコンポーネント要素をchildrenに入れたいときに便利です。
6. childrenの型定義で初心者が覚えておくべきこと
初心者がまず覚えるべきポイントは次の通りです。
ReactNodeを使えば幅広くchildrenを受け取れる。stringを指定すれば文字列だけに限定できる。ReactElementを使えばReact要素だけを受け取れる。
最初はReactNodeを使っておけば十分です。その後、プロジェクトの要件に応じて細かく型を制御する方法を学ぶとよいでしょう。