カテゴリ: React 更新日: 2026/02/12

TypeScriptでStateを型定義する方法を徹底解説!初心者でもわかるReactとTypeScript入門

TypeScriptでStateを型定義する方法
TypeScriptでStateを型定義する方法

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

生徒

「ReactのStateってよく出てきますけど、TypeScriptで型をつける必要があるんですか?」

先生

「Stateとはコンポーネントの中で変わるデータのことです。型をつけると、どんな値が入るのかが明確になって、間違いを防げるんですよ。」

生徒

「なるほど!型を決めると安心ですね。具体的にどうやって書くんですか?」

先生

「では、TypeScriptでStateを型定義する方法を順番に見ていきましょう!」

1. Stateとは何かを理解しよう

1. Stateとは何かを理解しよう
1. Stateとは何かを理解しよう

State(ステート)とは、Reactコンポーネントの中で変化する値を管理する仕組みです。例えば「カウンターアプリ」でボタンを押すたびに数字が増えるとき、その数字を保存しているのがStateです。

TypeScriptを使わない場合は、Stateにどんな値でも入ってしまうため、思わぬエラーの原因になります。型を決めておけば「このStateは数字しか入らない」といったルールを守れるので、安全にプログラムを書けます。

2. 基本的なStateの型定義

2. 基本的なStateの型定義
2. 基本的なStateの型定義

まずは数字をカウントするStateを型定義してみましょう。


import React, { useState } from "react";

const Counter: React.FC = () => {
  const [count, setCount] = useState<number>(0);

  return (
    <div>
      <p>現在のカウント: {count}</p>
      <button onClick={() => setCount(count + 1)}>増やす</button>
    </div>
  );
};

export default Counter;
(画面に「現在のカウント: 0」と表示され、ボタンを押すたびに1ずつ増えていきます)

useState<number>と書くことで、このStateは数字型だけを受け取ると定義しています。文字列を入れようとするとエラーになります。

3. 文字列のStateを型定義する

3. 文字列のStateを型定義する
3. 文字列のStateを型定義する

次に文字列を扱うStateを見てみましょう。


const Message: React.FC = () => {
  const [text, setText] = useState<string>("こんにちは!");

  return (
    <div>
      <h1>{text}</h1>
      <button onClick={() => setText("変更されました!")}>更新</button>
    </div>
  );
};
(画面に「こんにちは!」と表示され、ボタンを押すと「変更されました!」に変わります)

この場合はstring型なので、数字を入れようとするとエラーになります。

4. オブジェクトのStateを型定義する

4. オブジェクトのStateを型定義する
4. オブジェクトのStateを型定義する

実際のアプリでは、Stateに複数のデータをまとめたオブジェクトを持たせることが多いです。その場合は型を別で定義すると分かりやすいです。


type User = {
  id: number;
  name: string;
  isStudent: boolean;
};

const UserInfo: React.FC = () => {
  const [user, setUser] = useState<User>({
    id: 1,
    name: "花子",
    isStudent: true,
  });

  return (
    <div>
      <p>ID: {user.id}</p>
      <p>名前: {user.name}</p>
      <p>学生: {user.isStudent ? "はい" : "いいえ"}</p>
    </div>
  );
};
(画面に「ID: 1」「名前: 花子」「学生: はい」と表示されます)

オブジェクトの型を定義することで、誤って存在しないプロパティを参照することを防げます。

5. Stateをnullやundefinedで扱う場合

5. Stateをnullやundefinedで扱う場合
5. Stateをnullやundefinedで扱う場合

Stateが最初は空で、あとから値が入る場合もあります。その場合は| nullを使って型を定義します。


type User = {
  id: number;
  name: string;
};

const Profile: React.FC = () => {
  const [user, setUser] = useState<User | null>(null);

  return (
    <div>
      {user ? <p>{user.name}さん</p> : <p>ユーザー情報はありません</p>}
    </div>
  );
};
(画面に「ユーザー情報はありません」と表示され、後からsetUserで値を入れるとユーザー名が表示されます)

このように型を工夫すれば、「まだ値がない場合」と「値がある場合」を明確に書けます。

6. Stateを配列で扱う場合

6. Stateを配列で扱う場合
6. Stateを配列で扱う場合

配列をStateにすることもよくあります。TypeScriptでは配列の中身の型を指定します。


const TodoList: React.FC = () => {
  const [todos, setTodos] = useState<string[]>([]);

  return (
    <div>
      <button onClick={() => setTodos([...todos, "新しいタスク"])}>
        追加
      </button>
      <ul>
        {todos.map((todo, index) => (
          <li key={index}>{todo}</li>
        ))}
      </ul>
    </div>
  );
};
(ボタンを押すたびにリストに「新しいタスク」が追加されていきます)

string[]と書くことで、「文字列の配列だけが入る」と定義しています。

7. 型定義をするメリットを理解しよう

7. 型定義をするメリットを理解しよう
7. 型定義をするメリットを理解しよう

Stateを型定義することで以下のメリットがあります。

  • 誤った値を入れようとするとすぐにエラーで気づける
  • エディタが補完してくれるので開発がスムーズになる
  • 他の人がコードを読むときにStateの中身が一目で分かる

初心者にとっても「間違えてエラーが出る」ことを事前に防げるため、学習がスムーズになります。

まとめ

まとめ
まとめ

今回の記事では、React開発において欠かせない「TypeScriptによるStateの型定義」について詳しく解説してきました。ReactのuseStateフックは非常に強力ですが、JavaScriptのままではデータの型が曖昧になりがちです。そこでTypeScriptを導入し、ジェネリクス(< >)を使って型を明示することで、開発効率とコードの安全性を劇的に向上させることができます。

学習のポイント振り返り

Stateの型定義をマスターするための重要なポイントを改めて整理しましょう。

  • 基本型の指定: useState<number>useState<string>のように、単純な値にはプリミティブ型を指定します。
  • オブジェクトとインターフェース: 複数の属性を持つデータは、typeinterfaceを使って構造を定義します。これにより、存在しないプロパティへのアクセスを未然に防げます。
  • 初期値が空の場合: useState<User | null>(null)のようにUnion型を活用することで、API通信待ちの状態などを安全に表現できます。
  • 配列の管理: string[]TodoItem[]のように定義し、不変性(イミュータビリティ)を保ちながらスプレッド構文などで更新します。

実践的な応用サンプル:フォーム入力の管理

最後に、これまでの知識を応用して、複数の入力項目を持つフォームのState管理をTypeScriptで実装してみましょう。実務でも非常によく使うパターンです。


import React, { useState } from "react";

// フォームデータの型定義
type RegistrationForm = {
  username: string;
  email: string;
  age: number | "";
};

const Registration: React.FC = () => {
  // 初期値をオブジェクトで設定
  const [formData, setFormData] = useState<RegistrationForm>({
    username: "",
    email: "",
    age: "",
  });

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    const { name, value } = e.target;
    setFormData({
      ...formData,
      [name]: name === "age" ? (value === "" ? "" : Number(value)) : value,
    });
  };

  return (
    

ユーザー登録フォーム

プレビュー: {formData.username} ({formData.email})

); }; export default Registration;
(画面にユーザー名とメールアドレスの入力欄が表示され、文字を入力するとリアルタイムで下のプレビューに反映されます。型定義のおかげで、数値のageと文字列の管理も安全に行えます)

このように、TypeScriptを使うことで「今、Stateの中には何が入っているのか」を常に把握できるようになります。最初は定義の手間を感じるかもしれませんが、エラーメッセージが親切になり、VSCodeなどのエディタによる自動補完が効くようになるため、結果として開発スピードは向上します。ReactとTypeScriptの組み合わせは、現代のフロントエンド開発における標準です。ぜひ今回の内容を自身のプロジェクトに取り入れて、堅牢なアプリケーション作りを目指してください。

先生と生徒の振り返り会話

生徒

「先生、ありがとうございました!TypeScriptでuseStateに型をつける方法、すごくスッキリ理解できました。特にオブジェクトや配列の時に型が決まっていると、次に何をすべきか迷わなくなりますね。」

先生

「その通りです!型は未来の自分や、一緒に開発する仲間への『説明書』のようなものなんですよ。複雑なデータ構造になればなるほど、その恩恵を感じるはずです。」

生徒

「確かに、配列の型定義 string[] とか、最初は書き方に戸惑いましたけど、慣れるとJavaScriptだけでは不安になりそうです(笑)。nullを許容するUnion型の書き方も、APIからデータを取ってくる時に重宝しそうですね。」

先生

「いいところに気づきましたね。実務ではデータがまだ届いていない状態(null)の考慮が必須ですから、そこを型で縛れるのはTypeScript最大のメリットの一つです。次は、Props(プロップス)の型定義にも挑戦してみましょうか?」

生徒

「はい!Stateの次はPropsですね。コンポーネント間のデータのやり取りも型で安全に守れるようになりたいです。頑張ります!」

先生

「その意気です。一歩ずつ着実に進んでいきましょう!」

カテゴリの一覧へ
新着記事
New1
React
Reactコンポーネントの再利用と分割を完全マスター!初心者でもわかるコンポーネント設計
New2
React
ReactでAxiosインターセプターの使い方を完全ガイド!初心者でもわかるリクエストとレスポンスの処理方法
New3
React
JSXの書き方!初心者でもわかるReactタグと属性の基本ルール解説
New4
React
ReactとDockerを使った開発環境構築の基本を徹底解説!初心者でもわかるReactとDockerの連携方法
人気記事
No.1
Java&Spring記事人気No1
React
ReactでonChangeイベントを使ってフォーム入力値を管理する方法を初心者向けに解説
No.2
Java&Spring記事人気No2
React
ReactとTypeScriptの環境構築をやさしく解説!Viteとtsconfigの設定も丁寧に紹介
No.3
Java&Spring記事人気No3
React
Reactのイベントハンドリングのアンチパターンまとめ!初心者でもわかる注意点
No.4
Java&Spring記事人気No4
React
Reactのカスタムフックの作り方を完全ガイド!再利用可能なロジックを切り出す仕組み
No.5
Java&Spring記事人気No5
React
ReactでFetch APIのローディング状態を管理する方法|初心者にもわかる解説
No.6
Java&Spring記事人気No6
React
create-react-appでReactプロジェクトを作成する手順を初心者向けに完全解説!
No.7
Java&Spring記事人気No7
React
ReactのuseStateとuseEffectでよくあるエラーと解決方法ガイド!初心者でもわかるReactフック
No.8
Java&Spring記事人気No8
React
Reactのフォーム処理でよくあるエラーと解決法を完全解説!初心者でも安心して学べるReact入門