1. 日付の文字列
  2. 前後に空白が入った日付
  3. 3 日前
  4. きょう更新
  5. 2 桁の日数
コース一覧
TypeScript型設計:オブジェクト・状態・ジェネリクス
typeofで絞り込む

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分

typeofで絞り込む

union のままでは片方の機能が使えない

union 型の値には、並べたすべての型に共通する操作しかできません。

TypeScript

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

trim は文字列の機能なので、数値かもしれない値には使わせてもらえません。使いたければ、文字列であることを先に確かめる必要があります。

typeof で確かめると型が狭まる

typeof は JavaScript にもある演算子で、値の種類を文字列で返します。TypeScript はこの判定を読み取って、分岐の中で型を狭めてくれます。

TypeScript

function label(updated: string | number): string { if (typeof updated === "string") { return updated.trim(); } return updated + "日前"; }

if の中では updated が string に確定しているので trim が使えます。そして if を抜けたあとは、残った number に確定します。可能性を消していくこの働きを絞り込みと呼びます。英語では narrowing です。

絞り込みに使える文字列

typeof が返す値のうち、この段階で使うのは次の 3 つです。文字列なら "string"、数値なら "number"、真偽値なら "boolean" が返ります。

TypeScript

function toText(value: string | number | boolean): string { if (typeof value === "boolean") { return value ? "公開" : "下書き"; } if (typeof value === "number") { return value + "件"; } return value; }

最後の return value は、string だけが残っているので型注釈どおりに通ります。分岐で消し切ると、注釈を足さなくても辻褄が合うようになります。

消し忘れると教えてくれる

絞り込みが足りないと、その場でエラーになります。

TypeScript

function toText(value: string | number): string { if (typeof value === "number") { return value + "件"; } return value.toFixed(1); // エラー Property 'toFixed' does not exist on type 'string'. }

数値を先に返してしまったあとに数値の機能を使おうとしたので止まりました。書いた分岐と使っている機能がずれていることを、型が指摘してくれています。

手を動かす

演習では、作品の更新情報を受け取ってラベルを作ります。日付の文字列で来ることも、何日前かの数値で来ることもあります。typeof で分けて、それぞれに合った文字列を返してください。

要件

  1. updated は文字列と数値のどちらも受け取れる型にする
  2. 文字列のときは前後の空白を取り除き、うしろに半角スペースと 更新 を付ける
  3. 数値のときは N日前に更新 の形で返す
  4. 振り分けには typeof を使う

入出力例

updatedLabel("2026-08-01") → "2026-08-01 更新" updatedLabel(" 2026-07-20 ") → "2026-07-20 更新" updatedLabel(3) → "3日前に更新" updatedLabel(0) → "0日前に更新" updatedLabel(14) → "14日前に更新"

ヒント

まず引数に union の型注釈を付けます。分岐を書くのはそのあとです

`typeof updated === "string"` が true の枝では、`updated` は文字列に確定しています

前後の空白を取り除くのは文字列の `trim` です。数値のままでは呼べません

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

関連レッスン

  • inと判別で絞り込む

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

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

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

  • つくる - 状態の型表現

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

  • 第5章クイズ

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

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

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

  • JavaScriptWeb で動的な振る舞いを担う言語
  • 演算子//は切り捨て除算(7 // 2 = 3)。
  • TypeScript静的型を加えた JavaScript の上位互換
  • 型注釈変数や引数に : 型 で宣言する書式
main.ts
学習モード
エディタを読み込んでいます

メモ

typeofで絞り込む

⌘S で保存