TS初めてのTypeScript

Day 3ユニオン・絞り込み・ジェネリクス(読める範囲で)

ユニオン型(A | B)とリテラル型

「AかBのどちらか」を表すユニオン型と、値そのものを型にするリテラル型を学ぶ。

「どちらか」を型で表す

現実のデータは「文字列のときもあれば数値のときもある」「3つの状態のどれか」といった形をよく取ります。こういう「AかBのどちらか」を1つの型で表すのがユニオン型です。書き方は縦棒 | でつなぐだけで、 と呼びます。

TYPESCRIPT
// id は「文字列」または「数値」のどちらか
let id: string | number;

id = "abc123"; // OK
id = 42;       // OK
id = true;     // エラー: boolean は string でも number でもない
string | number は「文字列か数値のどちらか」を表す

さらに強力なのがリテラル型です。ふつう型は string のように「文字列全般」を表しますが、リテラル型は "success" のように「その値そのもの」を型にします。これをユニオンと組み合わせると「決まった選択肢のどれか」を表現できます。

TYPESCRIPT
// status は「この3つの文字列のどれか」しか受け付けない
type Status = "idle" | "loading" | "done";

let s: Status = "loading"; // OK
s = "done";                // OK
s = "finished";            // エラー: 3つの選択肢に無い
リテラル型のユニオンで「決まった選択肢」を表現する

なぜリテラル型が便利なのか

AIに状態管理のコードを書かせると、"loading" のつもりで "Loading" や "loding" と綴りがブレることがあります。リテラル型で選択肢を固定しておくと、こうしたタイプミスをその場で赤線として検出でき、実行する前に気づけます。

型が広すぎる

string にすると何でも入り、綴りミスを見逃す

TYPESCRIPT
let status: string = "lodaing"; // ミスに気づけない

選択肢を固定

リテラル型なら許されない値は即エラー

TYPESCRIPT
type Status = "idle" | "loading" | "done";
let status: Status = "lodaing"; // エラーで即発覚
  • ユニオン型: A | B と書き「AかBのどちらか」を表す
  • リテラル型: "success" や 200 のように「値そのもの」を型にする
  • 両者を組み合わせると「決まった選択肢のどれか」を安全に表現できる

AIにはこう聞く

「このボタンの状態は idle / loading / done の3つだけ。これをリテラル型のユニオンで表して、状態に応じて表示を切り替えるコードを書いて」と伝えると、選択肢が固定された安全なコードが返ってきます。

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

type Result = "ok" | "error"; と定義したとき、代入できないものはどれ?

Q2

ユニオン型 string | number の変数に対して、安全に代入できる値はどれ?

Q3

リテラル型のユニオン(例: "idle" | "loading" | "done")を使うと、なぜバグを早く見つけられるのか説明してください。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。