1. 読み込み中
  2. 読み込み中だが配列は届いている
  3. 読み込み失敗
  4. 成功したが 0 件
  5. 成功して 1 件
  6. 成功して 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分

つくる - 状態の型表現

第5章の道具を 1 本にまとめる

この回で新しい知識は出てきません。第5章で覚えたものだけを使います。使うのは、リテラル型の union で状態を列挙すること、switch で状態をすべて書き切ること、そして分岐の中では型が確定していること、の 3 つです。

作るのは、ポートフォリオ一覧の表示文言を組み立てる関数です。React 実践コースでは、これとまったく同じ形の判断を画面部品の中で書くことになります。

型で不正な状態を作れなくする

もとの JavaScript は、こんな持ち方をしていました。

JavaScript

function portfolioView(isLoading, hasError, titles) { if (isLoading) { return "作品を読み込んでいます"; } if (hasError) { return "読み込みに失敗しました"; } return "公開作品は" + titles.length + "件です"; }

動きはします。ただし isLoading と hasError の両方が true という、ありえない呼び出しができてしまいます。そのとき何が起きるかは、if を書いた順番に左右されます。仕様ではなく偶然で決まっている、ということです。

状態を 1 つの union にすると、この呼び出し自体が書けなくなります。

TypeScript

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

変数は 1 つしかないので、2 つの状態を同時に持てません。バグを見つけるのではなく、バグを書けなくする、というのが型の一番強い使い方です。

成功のときだけ中身を見る

今回は、成功したときの表示が 2 通りに分かれます。作品が 1 件でもあれば件数を出し、0 件ならまだ無いことを伝えます。

TypeScript

case "success": if (titles.length === 0) { return "公開作品はまだありません"; } return "公開作品は" + titles.length + "件です";

読み込み中や失敗のときに titles を見に行かないところが大事です。データがまだ無い状態でデータを触る、という事故が起きる余地を消しています。

手を動かす

演習では portfolioView を完成させます。switch で 3 つの状態を書き切り、成功の枝の中だけで件数を判定してください。default は置きません。書き漏らした状態があれば、戻り値が string に足りないという指摘が出ます。

要件

  1. switch で 3 つの状態をすべて書き切る
  2. default は置かない
  3. 成功の枝の中で、作品が 0 件かどうかを判定する
  4. 読み込み中と失敗の枝では titles を参照しない
  5. 型の定義は変えない

入出力例

portfolioView("loading", []) → "作品を読み込んでいます" portfolioView("loading", ["プロフィールサイト"]) → "作品を読み込んでいます" portfolioView("error", []) → "読み込みに失敗しました" portfolioView("success", []) → "公開作品はまだありません" portfolioView("success", ["プロフィールサイト"]) → "公開作品は1件です" portfolioView("success", ["プロフィールサイト","自己紹介カード","スキル一覧の表"]) → "公開作品は3件です"

ヒント

先に `switch` の骨組みを作り、3 つの `case` を並べてから中身を書きます

成功の枝だけが 2 通りに分かれます。`case` の中でさらに `if` を書いて構いません

件数の判定には `titles.length` を使います。0 件かどうかを先に見てください

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

関連レッスン

  • 第5章クイズ

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

  • なぜジェネリクスか

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

  • 状態で表示を切り替える

    状態別のメッセージ関数を書き、unionと分岐で全パターンを網羅できるようになります。

  • inと判別で絞り込む

    公開作品と下書き作品を見分け、オブジェクトの種類を型で判別できるようになります。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 関数処理に名前を付けて再利用できる単位
  • 判断YES/NO 分岐を表す菱形
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 変数データに名前をつけて参照する仕組み
  • 戻り値呼び出し元への返答を表す点線矢印
main.ts
学習モード
エディタを読み込んでいます

メモ

つくる - 状態の型表現

⌘S で保存