カテゴリ: React 更新日: 2026/01/31

ReactのPropsでジェネリクスを使った型定義を完全ガイド!初心者でもわかる型安全なProps管理

Propsでジェネリクスを使った型定義
Propsでジェネリクスを使った型定義

先生と生徒の会話形式で理解しよう

生徒

「ReactでPropsを型安全に使うときにジェネリクスを使えるんですか?」

先生

「はい、ジェネリクスを使うと柔軟で再利用性の高い型定義ができますよ。」

生徒

「ジェネリクスってそもそも何ですか?」

先生

「ジェネリクスは『型の入れ物』みたいなものです。コンポーネントを作るときに、どんな型を使うかを後から決められる仕組みなんです。例を見てみましょう!」

1. ジェネリクスとは?

1. ジェネリクスとは?
1. ジェネリクスとは?

ジェネリクスとは「型を引数のように扱える仕組み」です。例えば<T>と書くことで、使うときに具体的な型を決められるようになります。これにより、同じコンポーネントを文字列でも数値でも使えるようになり、再利用性が高まります。

日常生活に例えると、透明な箱(ジェネリクス)を用意して、中に「りんご(string)」や「バナナ(number)」を入れて使えるようなイメージです。

2. ReactのPropsでジェネリクスを使う基本例

2. ReactのPropsでジェネリクスを使う基本例
2. ReactのPropsでジェネリクスを使う基本例

まずは基本的なジェネリクスを使ったPropsの定義を見てみましょう。


type ItemProps<T> = {
  value: T;
};

function Item<T>({ value }: ItemProps<T>) {
  return <div>{String(value)}</div>;
}

function App() {
  return (
    <div>
      <Item value="文字列です" />
      <Item value={123} />
    </div>
  );
}
(画面に「文字列です」と「123」が表示されます)

3. 複数の型を扱うジェネリクス

3. 複数の型を扱うジェネリクス
3. 複数の型を扱うジェネリクス

ジェネリクスは複数の型を受け取ることもできます。例えば「idは数値、nameは文字列」というPropsを作れます。


type PairProps<T, U> = {
  first: T;
  second: U;
};

function Pair<T, U>({ first, second }: PairProps<T, U>) {
  return (
    <div>
      {String(first)} - {String(second)}
    </div>
  );
}

function App() {
  return (
    <div>
      <Pair first={1} second="りんご" />
      <Pair first="ユーザー" second={true} />
    </div>
  );
}
(画面に「1 - りんご」と「ユーザー - true」が表示されます)

4. 配列とジェネリクスを組み合わせる

4. 配列とジェネリクスを組み合わせる
4. 配列とジェネリクスを組み合わせる

Propsで配列を受け取る場合にもジェネリクスを使うと便利です。どんな型の配列かを呼び出し側で決められるので、コードが使いやすくなります。


type ListProps<T> = {
  items: T[];
};

function List<T>({ items }: ListProps<T>) {
  return (
    <ul>
      {items.map((item, index) => (
        <li key={index}>{String(item)}</li>
      ))}
    </ul>
  );
}

function App() {
  return (
    <div>
      <List items={["りんご", "バナナ", "ぶどう"]} />
      <List items={[1, 2, 3]} />
    </div>
  );
}
(画面に「りんご・バナナ・ぶどう」と「1・2・3」のリストが表示されます)

5. ジェネリクスに制約をつける

5. ジェネリクスに制約をつける
5. ジェネリクスに制約をつける

ジェネリクスには「この型は文字列である必要がある」といった制約をつけられます。これを「extends」を使って書きます。


type NameProps<T extends string> = {
  name: T;
};

function Greeting<T extends string>({ name }: NameProps<T>) {
  return <div>こんにちは、{name}さん!</div>;
}

function App() {
  return (
    <div>
      <Greeting name="太郎" />
      {/* <Greeting name={123} /> ← これはエラーになります */}
    </div>
  );
}
(画面に「こんにちは、太郎さん!」が表示されます)

6. ジェネリクスを使うメリット

6. ジェネリクスを使うメリット
6. ジェネリクスを使うメリット

ジェネリクスを使うと、以下のメリットがあります。

  • 再利用性が高い:同じコンポーネントを様々な型で使える。
  • 型安全:間違った型を渡すとエラーが出るので安心。
  • コードがシンプル:汎用的なコンポーネントを少ない記述で作れる。

7. 注意点

7. 注意点
7. 注意点

ジェネリクスは強力ですが、複雑にしすぎると逆にわかりにくくなります。初心者のうちは「配列」「オブジェクト」「文字列」などシンプルなケースから使い始めるのがおすすめです。

カテゴリの一覧へ
新着記事
New1
React
Reactの条件分岐の使い方を完全ガイド!初心者でもわかるReactの条件分岐
New2
React
PropsとStateの違いを徹底解説!使い分けのポイントまとめ
New3
React
Reactのフォーム入力を再利用しよう!初心者でもわかるフィールドコンポーネント化の考え方
New4
React
Reactでできること一覧!初心者でもわかるWebアプリ・スマホアプリ・PWAの活用方法
人気記事
No.1
Java&Spring記事人気No1
React
Reactでキーボードイベントを活用する方法!onKeyDown, onKeyUp, onKeyPressを初心者向けに解説
No.2
Java&Spring記事人気No2
React
ReactのPresentational Componentを完全ガイド!初心者でもわかるStateを持たないコンポーネントの特徴
No.3
Java&Spring記事人気No3
React
ViteでReact開発環境を構築する手順を完全ガイド!初心者でもできるReactの環境構築
No.4
Java&Spring記事人気No4
React
Reactでフォーカスイベントを制御する方法!onFocusとonBlurを初心者向けに解説
No.5
Java&Spring記事人気No5
React
Reactとは?初心者でもわかるReact.jsの基本概念と特徴をやさしく解説
No.6
Java&Spring記事人気No6
Next.js
Next.js Server Componentsのメリット・デメリットを完全解説!初心者でもわかるNext.jsの基本
No.7
Java&Spring記事人気No7
React
Reactのカードコンポーネントを汎用的に設計する方法!初心者でもわかる再利用の考え方
No.8
Java&Spring記事人気No8
React
create-react-appでReactプロジェクトを作成する手順を初心者向けに完全解説!