1. 読み込み中は表示しない
  2. 成功したら表示する
  3. 失敗したら表示しない
コース一覧
TypeScript型設計:オブジェクト・状態・ジェネリクス
状態のunion

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分

状態のunion

画面には状態がある

ゆめさくのポートフォリオ一覧は、サーバーから作品データを取ってきて表示します。取ってくるあいだ画面は空っぽで、取り終わったら一覧が出て、失敗したらエラーが出ます。この 3 つの状況を、通信状態と呼びます。

JavaScript ではよく、真偽値を並べて表していました。

JavaScript

let isLoading = true; let hasError = false;

この持ち方には穴があります。isLoading と hasError が両方 true になれる、という穴です。読み込み中でありながら失敗もしている、という状況はありえないのに、コードの上では書けてしまいます。

3 つの状態を 1 つの型にする

リテラル型の union にすると、ありえない組み合わせを最初から作れなくします。

TypeScript

type FetchStatus = "loading" | "success" | "error"; let status: FetchStatus = "loading";

変数は 1 つなので、同時に 2 つの状態にはなれません。取りうる状態がちょうど 3 つだと、型を見ただけで分かります。

この FetchStatus は、このあと第5章のつくる回でも使いますし、React 実践コースでも同じ形で出てきます。名前と 3 つの値をこのまま覚えてください。

未定義の状態はエラーになる

TypeScript

let status: FetchStatus = "loaded"; // エラー Type '"loaded"' is not assignable to type 'FetchStatus'.

"loaded" は "loading" に似ていますが、型に無いので止まります。文字列で状態を持つと必ず出てくる打ち間違いを、型が引き受けてくれます。

状態で分岐する

状態は、比較して使います。

TypeScript

type FetchStatus = "loading" | "success" | "error"; function isBusy(status: FetchStatus): boolean { return status === "loading"; }

比べる相手も型に含まれているかどうかが検査されます。

TypeScript

if (status === "loded") { } // エラー This comparison appears to be unintentional because the types // 'FetchStatus' and '"loded"' have no overlap.

条件の書き間違いは、いつまでも false になるだけで気づけない種類のバグです。それを型が拾ってくれるのは大きな利点です。

手を動かす

演習では FetchStatus を自分で定義して、作品一覧を表示してよい状態かどうかを判定する関数を書きます。表示してよいのは、読み込みが成功したときだけです。

要件

  1. FetchStatus という型エイリアスを定義する
  2. 許す値は "loading" "success" "error" の 3 つだけにする
  3. 引数 status に FetchStatus を付ける
  4. 成功しているときだけ true を返す

入出力例

canShowWorks("loading") → false canShowWorks("success") → true canShowWorks("error") → false

ヒント

型エイリアスは `type` から始めて、3 つの値を縦棒でつなぎます

引数の型注釈には、定義した型の名前をそのまま書けます

表示してよいかどうかは、状態が成功と等しいかどうかの比較 1 つで表せます

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

関連レッスン

  • typeofで絞り込む

    入力の型で処理を分け、分岐の中で型を確定できるようになります。

  • inと判別で絞り込む

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

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

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

  • つくる - 状態の型表現

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

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

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

  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 変数データに名前をつけて参照する仕組み
  • 関数処理に名前を付けて再利用できる単位
  • 引数位置引数=順番で渡す。
main.ts
学習モード
エディタを読み込んでいます

メモ

状態のunion

⌘S で保存