CHAPTER 05 / 08 UNIONS & SAFETY

「ないかもしれない」を扱う

ユニオン型、null、undefined。「申請中だけ」「データがないとき」を考えます。

◷ 目安 15分確認クイズ 3問未読
この章のゴール

選択肢のある型と、値が存在しない場合の処理を読み取れる。

この章で学ぶこと
5.1

自由入力にせず、選択肢を決める

コードを読むTypeScript
type Status = "下書き" | "申請中" | "承認済み";

let status: Status = "申請中";

縦棒|は「いずれか」を表します。この例では状態を3種類に限定します。これをユニオン型と呼びます。決めた文字列そのものを型に使う「リテラル型」と組み合わせています。

単なるstringなら「承認済」「承認ずみ」も文字列として受け付けます。選択肢を決めれば表記のばらつきを検出しやすくなります。ですが、申請中から承認済みに変えてよいか、誰が変更できるかは、別の業務ルールです。

5.2

「値がない」にも、表現がある

表現よくある意味例
undefined未設定・存在しない省略された任意のメモ
null値がないことを明示承認者がまだ決まっていない
""文字数が0の文字列入力欄は存在するが空欄
0数値のゼロ金額が0円

空文字・0・null・undefinedは同じものではありません。たとえば「金額未入力」と「0円」を同じ扱いにすると、集計や承認の判断が変わってしまいます。

5.3

あることを確かめてから使う

コードを読むTypeScript
function showMemo(memo: string | undefined): string {
  if (memo === undefined) {
    return "メモなし";
  }
  return memo.toUpperCase();
}

メモは文字列か、未設定かのどちらかです。最初のifで未設定のケースを処理すると、その先は文字列として扱えます。条件から型の候補を絞ることをナローイング(型の絞り込み)と呼びます。

「もし存在するなら使う」のように、値の状態によって処理を分けるのが基本です。「絶対にあるはず」と宣言して確認を省くと、実際には存在しないケースで失敗する可能性があります。

5.4

?. と ?? の読み方

コードを読むTypeScript
type User = { name: string };
function approverLabel(approver: User | null): string {
  return approver?.name ?? "未設定";
}

const label = approverLabel(null);

?.は、左側がnullかundefinedなら、その先の項目にアクセスせずundefinedを返します。??は、左側がnullかundefinedのときだけ右側の代わりの値を使います。この例のlabelは「未設定」です。

??は0や空文字を「値がない」とはみなしません。似た記号の||は0や空文字でも代わりの値を使うため、金額などで取り違えると結果が変わります。記号の暗記よりも「何を未設定として扱うか」を確認しましょう。

5.5

見つからなかったときも、正常な道筋にする

社員番号で承認者を検索しても、退職や異動で見つからないことがあります。ネットワークの通信が成功しても、データが空のこともあります。「必ずある」だけで設計すると、こうした場面で画面が止まる原因になります。

CHECK YOUR UNDERSTANDING

理解を、たしかめよう。

各問の答えを選び、「答え合わせ」を押してください。何度でもやり直せます。

Q01"下書き" | "申請中" の縦棒は?
Q020 ?? 100 の結果は?
Q03値の型を条件で絞り込むことを何という?

ここまで読めたら、ひと区切り。

理解できたところまでを振り返って、読了を記録しましょう。

記録はこのブラウザに保存されます。