1. 数値の ID
  2. 文字列の ID
  3. 2 桁の数値 ID
  4. 記号を含む文字列 ID
コース一覧
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型

縦棒で「AまたはB」を書く

ここまでは、1 つの名前に 1 つの型を付けてきました。でも実際のデータには「文字列のときも数値のときもある」ものがあります。ゆめさくの作品 ID がそうです。古い作品は 1 2 のような数値で、新しい作品は "w-001" のような文字列で入っています。

こういうときは、型を縦棒でつなぎます。

TypeScript

let workId: string | number; workId = "w-001"; workId = 7;

この string | number を union 型と呼びます。日本語では合併型ですが、現場ではそのまま union と呼ぶことがほとんどです。読むときは「string または number」と読みます。

書いていない型は入らない

union は「なんでも入る」という意味ではありません。並べた型だけが入ります。

TypeScript

let workId: string | number; workId = true; // エラー Type 'boolean' is not assignable to type 'string | number'.

any との違いはここです。any は検査そのものを止めますが、union は許す型を自分で決めて、それ以外を止めます。選択肢を広げながら、検査は効いたままにできます。

3 つ以上つなげる

縦棒はいくつでも並べられます。

TypeScript

let cellValue: string | number | boolean;

見やすさのために、先頭にも縦棒を置く書き方もよく使われます。意味は同じです。

TypeScript

type CellValue = | string | number | boolean;

共通してできることだけができる

union 型の値には、並べたすべての型が持っている操作しかできません。

TypeScript

function show(workId: string | number): string { return "作品 " + workId; }

文字列との連結は string でも number でもできるので、これは通ります。一方、workId.trim() は number が trim を持っていないので止められます。

TypeScript

function show(workId: string | number): string { return workId.trim(); // エラー Property 'trim' does not exist on type 'string | number'. }

片方だけの機能を使いたいときは、どちらなのかを先に確かめる必要があります。そのやり方は No.34 で扱います。この回では、まず union を書けるようになるところまでです。

手を動かす

演習では、作品 ID を受け取って見出しを作る関数に型を付けます。ID は数値でも文字列でも来ます。両方を受け取れる型注釈を書いてください。

要件

  1. id は文字列と数値のどちらも受け取れる型にする
  2. title には文字列の型を付ける
  3. 処理の中身は変えない

入出力例

workHeading(1, "プロフィールサイト") → "#1 プロフィールサイト" workHeading("w-001", "自己紹介カード") → "#w-001 自己紹介カード" workHeading(12, "スキル一覧の表") → "#12 スキル一覧の表" workHeading("draft-9", "配色メモ") → "#draft-9 配色メモ"

ヒント

2 つの型を許したいときは、型名を縦棒でつなぎます

`id` に付ける型は `string` と `number` の union です

`title` は文字列だけなので `string` のままで構いません

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

関連レッスン

  • リテラル型

    作品カテゴリを文字列リテラル型にし、値そのものを型にできるようになります。

  • 状態のunion

    通信状態の型を定義し、画面の状態を型で列挙できるようになります。

  • typeofで絞り込む

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

  • inと判別で絞り込む

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

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

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

  • 関数処理に名前を付けて再利用できる単位
  • 型注釈変数や引数に : 型 で宣言する書式
  • 処理計算や代入を表す長方形
main.ts
学習モード
エディタを読み込んでいます

メモ

union型

⌘S で保存