1. 読み込み中
  2. 読み込み成功
  3. 読み込み失敗
コース一覧
TypeScript型設計:オブジェクト・状態・ジェネリクス
状態で表示を切り替える

TypeScript型設計:オブジェクト・状態・ジェネリクス

interface、optional property、readonly、union・リテラル型、型ガード、ジェネリクスを扱う全23レッスンの型設計コースです。Profile・Work・ApplicationStateを題材に、APIや画面で扱うデータと状態を壊れにくい型として設計します。既存JavaScriptプロジェクトの移行は次のコースで扱います。

1
オブジェクト型とinterface
01. interface15分
02. 省略可能なプロパティ15分
03. readonly15分
04. interfaceとtype15分
05. ネストした型15分
06. オブジェクト配列15分
07. つくる - Work型とProfile型20分
08. 第4章クイズ15分
2
union・リテラル型・型ガード
01. union型15分
02. リテラル型15分
03. 状態のunion15分
04. typeofで絞り込む15分
05. inと判別で絞り込む15分
06. 状態で表示を切り替える15分
07. つくる - 状態の型表現20分
08. 第5章クイズ15分
3
ジェネリクス入門
01. なぜジェネリクスか10分
02. ジェネリック関数15分
03. 配列を返す汎用関数15分
04. 制約付きジェネリクス15分
05. 組み込みのジェネリクス15分
06. つくる - 汎用フィルタ関数20分
07. 第6章クイズ15分

状態で表示を切り替える

状態の数だけ表示がある

No.33 で定義した通信状態の型を、もう一度出します。

TypeScript

type FetchStatus = "loading" | "success" | "error";

画面はこの状態を見て、出すものを切り替えます。読み込み中なら待ってもらう文言、成功なら一覧、失敗ならやり直しの案内です。状態が 3 つなら、表示も 3 通り用意しなければいけません。

if を並べても書けますが、状態の数が増えると読みにくくなります。値そのもので分けるときは switch のほうが向いています。

switch で状態ごとに分ける

TypeScript

function statusMessage(status: FetchStatus): string { switch (status) { case "loading": return "作品を読み込んでいます"; case "success": return "作品を読み込みました"; case "error": return "読み込みに失敗しました"; } }

case の右に書けるのは、FetchStatus に含まれる値だけです。型に無い値を書くと止まります。

TypeScript

case "loaded": // エラー Type '"loaded"' is not comparable to type 'FetchStatus'.

書き漏らしも型が見つける

この書き方の本当の価値は、case を 1 つ忘れたときに出ます。

TypeScript

function statusMessage(status: FetchStatus): string { switch (status) { case "loading": return "作品を読み込んでいます"; case "success": return "作品を読み込みました"; } } // エラー Function lacks ending return statement and not all code paths // return a value.

"error" のときだけ、どの return にも当たらず関数が終わってしまいます。戻り値を string と約束してあるので、その穴が指摘されました。すべての状態を書き切ったときだけエラーが消える、という状況になっています。これを網羅と呼びます。

default を置くと網羅が効かなくなる

つい書きたくなりますが、default を置くと様子が変わります。

TypeScript

default: return "";

これがあると、case をいくつ忘れても穴が埋まってしまい、エラーが出ません。そして後日 "idle" のような状態を型に足したとき、その状態は誰にも気づかれないまま default に落ちます。

状態の union を switch で捌くときは default を置かない、と覚えてください。書き漏らしを教えてもらう権利を、自分から手放さないためです。

手を動かす

演習では、通信状態から画面に出すメッセージを返す関数を書きます。switch で 3 つの状態をすべて書き切ってください。

要件

  1. switch で状態ごとに分ける
  2. 3 つの状態すべてに case を書く
  3. default は置かない
  4. 型の定義は変えない

入出力例

statusMessage("loading") → "作品を読み込んでいます" statusMessage("success") → "作品を読み込みました" statusMessage("error") → "読み込みに失敗しました。時間をおいて試してください"

ヒント

`switch (status)` と書き、その中に `case` を 3 つ並べます

各 `case` で `return` すれば `break` は要りません

`default` を書くと書き漏らしを検出できなくなります。3 つの `case` だけで終わらせてください

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/06

関連レッスン

  • つくる - 状態の型表現

    通信状態まわりを型で固め、不正な状態を型で排除します。

  • 第5章クイズ

    union型・リテラル型・型ガードの理解を確認します。

  • なぜジェネリクスか

    any版の汎用関数で起きる事故を見て、型引数で汎用化する動機を説明できるようになります。

main.ts
学習モード
エディタを読み込んでいます

メモ

状態で表示を切り替える

⌘S で保存