カテゴリ: TypeScript 更新日: 2026/06/06

TypeScriptの型ガードの使い方をやさしく解説!typeof・in・instanceofで安全に型チェック

TypeScriptの型ガード(typeof・in・instanceof)の書き方
TypeScriptの型ガード(typeof・in・instanceof)の書き方

先生と生徒の会話形式で理解しよう

生徒

「TypeScriptで、変数の中身がどんな種類なのかを確認する方法ってありますか?」

先生

「はい、TypeScriptでは型ガード(Type Guard)という仕組みを使って、変数の中身の種類を判別できます。」

生徒

「どうやって判別するんですか?難しそう…」

先生

「安心してください。typeofininstanceofという3つの方法を使えば、初心者でも簡単に型チェックできますよ!これから一つずつわかりやすく見ていきましょう。」

1. 型ガードとは?

1. 型ガードとは?
1. 型ガードとは?

型ガード(Type Guard)とは、「この値はいまどんな種類なのか?」を判断して、プログラムが安全に動くように手助けしてくれる仕組みです。TypeScriptでは変数が複数の型を取りうることがありますが、型ガードを使うことで、状況に応じて正しい処理を選べるようになります。

たとえば「文字を受け取ったらメッセージを表示し、数値を受け取ったら計算する」というように、型ごとに動作を変えたいときにとても役立ちます。型をしっかり見分けることで、エラーの発生を防ぎ、コードの読みやすさもぐっと高まります。

次の例のように、型ガードを使わずに処理を書こうとすると、どちらの型にも対応するために複雑になりがちです。


function show(value: string | number) {
    // このままだと、valueが文字列か数値か分からない
    console.log("受け取った値:", value);
}
show("こんにちは");
show(10);

しかし、型ガードを使えば型を見極められるため、次のように「文字列ならこうする」「数値ならこうする」と明確に書き分けられます。


function show(value: string | number) {
    if (typeof value === "string") {
        console.log("文字列として扱います:", value);
    } else {
        console.log("数値として扱います:", value * 2);
    }
}

このように、型ガードはTypeScriptの特徴である「型の安全性」を最大限に引き出し、初心者でも安心してコードを書けるようにしてくれる大切な機能です。

2. typeof を使った型ガード

2. typeof を使った型ガード
2. typeof を使った型ガード

typeofは、変数がどんな種類の値なのかを確認するためのもっとも基本的な型ガードです。特に「文字列なのか数値なのか」といったプリミティブ型の判定に強く、TypeScriptでも非常によく使われます。

型ガードを使わないと、1つの変数に複数の型が入りうる場合、どの処理が正しいのか判断しにくくなります。しかしtypeofを使えば、実行中の値を調べて安全に処理を分岐できます。


function printValue(value: string | number) {
    if (typeof value === "string") {
        console.log("文字列として処理します:" + value);
    } else if (typeof value === "number") {
        console.log("数値として計算します:" + (value * 2));
    }
}
printValue("こんにちは");
printValue(123);

文字列として処理します:こんにちは
数値として計算します:246

このように、typeofを使うと、文字列なら文字列用の処理、数値なら数値用の処理と明確に分けることができます。特に「画面にメッセージを表示する」「数値を計算する」といった異なるジャンルの処理をまとめたい場合に大活躍します。

ただし、typeofが使えるのは基本的な値(string、number、boolean、undefined、symbol、bigint、function、object)の判定だけで、オブジェクトの細かい形までは判別できません。「オブジェクトの違いを見分けたい場合」は別の型ガードが必要になります。

3. in を使った型ガード

3. in を使った型ガード
3. in を使った型ガード

in演算子は、オブジェクトの中に特定のプロパティ(名前)があるかどうかを調べるための型ガードです。「このオブジェクトは犬なのか?猫なのか?」といったように、持っている機能の違いで判断したいときにとても便利です。

イメージとしては、「この箱にはリモコンが入っているか?それとも本が入っているか?」を、中身の種類ではなく入っている物の名前で見分けるような感覚です。TypeScript のオブジェクトも、「このプロパティがあるならこの型だな」と判断できます。


type Dog = { bark: () => void };
type Cat = { meow: () => void };

function speak(animal: Dog | Cat) {
    if ("bark" in animal) {
        // animal の中に bark プロパティがあれば Dog とみなせる
        animal.bark();
    } else {
        // bark がないので、ここでは Cat として扱える
        animal.meow();
    }
}

speak({ bark: () => console.log("ワン!") });
speak({ meow: () => console.log("ニャー!") });

ワン!
ニャー!

この例では、Dog | Catという「犬か猫か分からない」状態の引数 animal を受け取っています。そのままでは barkmeow も安全には呼べませんが、"bark" in animal というチェックを入れることで、「このオブジェクトは吠える機能(bark)を持っているから Dog だ」と判断できるようになります。

反対に、bark がなければ Cat だと分かるので、安心して meow() を呼び出せます。このように、in を使うと「どんなプロパティを持っているか」でオブジェクトの型を絞り込めるため、複数の型をまとめて扱うときに大きな力を発揮します。

もう少し身近な例として、「年齢を持っているユーザーだけ特別なメッセージを出したい」といった場合も、in を使うとすっきり書けます。


type BasicUser = { name: string };
type DetailUser = { name: string; age: number };

function showUser(user: BasicUser | DetailUser) {
    if ("age" in user) {
        console.log(`${user.name} さんは ${user.age} 歳です。`);
    } else {
        console.log(`${user.name} さんは年齢未入力です。`);
    }
}

このように、in 演算子を使った型ガードは、TypeScript のオブジェクト型を安全に扱うための基本テクニックです。「このプロパティがあるならこの型」と自然に読めるコードになるので、初心者でも直感的に理解しやすくなります。

4. instanceof を使った型ガード

4. instanceof を使った型ガード
4. instanceof を使った型ガード

instanceofは、「この変数が、あるクラスから作られたインスタンス(実体)かどうか」を調べるための型ガードです。もう少し噛み砕くと、「このデータはどの設計図(クラス)から生まれたものなのか?」を確認するための道具だと思ってください。

クラス(class)は、車や自転車といったモノの設計図にあたります。その設計図から実際に作られた1台1台の車や自転車が「インスタンス」です。TypeScriptでは、このインスタンスがどのクラス由来なのかをinstanceofで判定できます。

まずは、車と自転車の2種類の乗り物をクラスで定義してみます。


class Car {
    drive() {
        console.log("車を運転します");
    }
}

class Bike {
    ride() {
        console.log("自転車に乗ります");
    }
}

次に、この2つのどちらかを受け取って動作を変える関数を用意します。ここでinstanceofを使うと、「これはCarなのか?それともBikeなのか?」を安全に判定できます。


function move(vehicle: Car | Bike) {
    if (vehicle instanceof Car) {
        // vehicle が Car から作られたインスタンスなら drive を呼ぶ
        vehicle.drive();
    } else {
        // それ以外(ここでは Bike)の場合は ride を呼ぶ
        vehicle.ride();
    }
}

move(new Car());
move(new Bike());

車を運転します
自転車に乗ります

この例では、move関数の引数vehicleCar | Bikeという「どちらか分からない型」です。そのままではdrive()ride()も安全には呼べませんが、vehicle instanceof Carでクラスを判定することで、「ここではCarとして扱ってよい」「ここではBikeとして扱ってよい」とTypeScriptに教えることができます。

もう1つ、日付の例でも見てみましょう。Dateクラスから作られたインスタンスかどうかも、同じように判定できます。


function showDateInfo(value: Date | string) {
    if (value instanceof Date) {
        console.log("日付オブジェクトです:", value.toLocaleDateString());
    } else {
        console.log("文字列としての日付です:", value);
    }
}

showDateInfo(new Date());
showDateInfo("2025-01-01");

このように、instanceofクラスベースのオブジェクトを見分けるときにとても頼りになる型ガードです。プリミティブな値(string や number)ではなく、「クラスから作られたインスタンスなのかどうか」を判断したい場面で積極的に使っていきましょう。

5. どの型ガードを使うべき?

5. どの型ガードを使うべき?
5. どの型ガードを使うべき?

ここまで紹介した typeofininstanceof の3つは、TypeScriptで型を安全に判断するための基本テクニックです。ただ「結局どれを使えばいいの?」と迷ってしまうこともありますよね。そこで、初心者の方でも選びやすいように、目的ごとに使い分けの目安をまとめてみましょう。

  • typeof … 「文字列か数値か」などの基本的な値の種類を判定したいときに使います。もっともシンプルで、まず最初に覚えたい型ガードです。
  • in … オブジェクトの中身によって処理を変えたいときに便利です。「このプロパティがあるならこの型だな」という判断ができるため、複数のオブジェクト型をひとまとめに扱うときに役立ちます。
  • instanceof … クラスを使ったコードで、「このデータはどのクラスから作られたのか」を判断したい場合に使います。クラスベースのオブジェクトを扱う場面では特に強力です。

たとえば、次のように3つを比べてみると違いがイメージしやすくなります。


// typeof の例
function show(v: string | number) {
    if (typeof v === "string") console.log("文字です:", v);
    else console.log("数値です:", v);
}

// in の例
type User = { name: string };
type Admin = { name: string; role: string };

function checkUser(u: User | Admin) {
    if ("role" in u) console.log("管理者:", u.role);
    else console.log("一般ユーザー");
}

// instanceof の例
class Dog {}
class Cat {}

function identify(a: Dog | Cat) {
    if (a instanceof Dog) console.log("犬です");
    else console.log("猫です");
}

このように、それぞれ「どんなときに使うのか」が違います。慣れてくると自然に選べるようになりますが、最初のうちは「目的に合わせて使い分ける」という考え方を意識すると理解しやすくなります。3つの型ガードを適切に使いこなせれば、TypeScriptで安全で読みやすいコードを書けるようになり、エラーにも強いプログラムになります。

まとめ

まとめ
まとめ

TypeScriptでコードを書くとき、型を安全に判別して処理を分けることはとても大切です。特に現代のフロントエンド開発やAPIのデータ処理では、1つの関数に複数の型が渡る場面がよくあります。そのまま処理するとエラーやバグの原因になるため、今回学んだ型ガードを使うことで、型に応じて正しく振る舞わせることができるようになります。

型ガードの基本は3つの方法です。
まずtypeofを使えば、数値や文字列などの基本型を簡単に判別できます。次にinは、オブジェクトに特定のプロパティがあるかどうかを確認するのに便利で、構造的な判定に向いています。そしてinstanceofは、クラスのインスタンスかどうかを調べたいときに活躍します。

以下に、3つの型ガードを組み合わせたサンプルコードを紹介します。

サンプル:すべての型ガードを使って安全に処理を分岐


class Dog {
    bark() {
        console.log("ワンワン!");
    }
}

class Cat {
    meow() {
        console.log("ニャーニャー!");
    }
}

function handle(value: string | number | Dog | Cat) {
    if (typeof value === "string") {
        console.log("文字列です:" + value.toUpperCase());
    } else if (typeof value === "number") {
        console.log("数値です:" + (value * 2));
    } else if (value instanceof Dog) {
        value.bark();
    } else if ("meow" in value) {
        value.meow();
    }
}

handle("こんにちは");
handle(10);
handle(new Dog());
handle(new Cat());

文字列です:コンニチハ
数値です:20
ワンワン!
ニャーニャー!

このように、typeofininstanceofをうまく組み合わせることで、どんな型が来ても安全に処理できるようになります。

実務でも、APIから返ってくるデータや、ユーザーの操作で動的に変わる値を扱うときに、型ガードを使って型をしっかり見極めることがバグの防止に直結します。

特にin演算子は、型のユニオン(複数型のどれか)を扱うときに大きな効果を発揮します。プロパティの存在チェックを活用すれば、明示的に型を分けて安全に処理を進めることができ、コードの可読性もぐんと上がります。

また、クラスベースで設計されたアプリケーションでは、instanceofでインスタンスの判定を行うことで、責任を持った処理の流れが書けるようになります。

型ガードは、TypeScriptの型システムを活かしきるための大切な技術です。これからも実際のコードにどんどん取り入れて、型安全な開発を目指していきましょう。

先生と生徒の振り返り会話

生徒

「先生、型ガードって最初は難しそうって思ったけど、やってみたら意外とわかりやすかったです!」

先生

「それはよかったですね。特にtypeofはJavaScriptでもおなじみの構文なので、入りやすかったのではないでしょうか。」

生徒

「はい!あと、オブジェクトにinを使ったチェックとか、クラスのinstanceofも実務でよく使えそうです!」

先生

「その通りです。型ガードはコードの安全性を高めるだけでなく、読みやすくてバグの少ないプログラムを書く助けにもなりますよ。」

生徒

「APIからいろんな型のデータが返ってくるときなんかも、型ガードでしっかり処理を分けられそうですね!」

先生

「ええ、その意識が大切です。これからTypeScriptのコードを書くときは、ぜひ型ガードを自然に取り入れていってくださいね。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

TypeScriptの型ガードとは何ですか?初心者向けにわかりやすく知りたいです

TypeScriptの型ガードとは、変数の中身が文字列なのか数値なのか、オブジェクトなのかを安全に判別する仕組みです。型ガードを使うことで、データの型ごとに安全に処理を分けることができ、実務でよく起こるエラーを防げます。

TypeScriptでtypeofを使う型ガードは何に使いますか?

typeofを使った型ガードは、変数が文字列か数値かなどの基本型を判別するために使います。string型・number型・boolean型などの基本的な型チェックに向いており、TypeScript初心者でも理解しやすい方法です。

typeofで判別できる型の種類を知りたいです

typeofで判別できるのは、string・number・boolean・undefined・symbol・bigint・function・objectといった基本的な型です。複雑なオブジェクトの違いやクラスの判定には向いていません。
カテゴリの一覧へ
新着記事
New1
JavaScript
JavaScriptでURLを正規化(canonical)する方法を徹底解説!初心者向けにわかりやすく解説
New2
TypeScript
TypeScriptの型まとめ!安全で保守性の高いコードを書く方法
New3
TypeScript
TypeScriptのプロジェクトをtscでビルドする基本操作を解説!初心者にもわかるステップバイステップ
New4
Claude Code
Claude Codeの基本的な使い方!起動から終了まで初心者向けに解説
人気記事
No.1
Java&Spring記事人気No1
TypeScript
TypeScript学習におすすめの無料教材・リファレンスサイト【初心者向け】
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptの文字列を分割する方法(splitメソッド)
No.4
Java&Spring記事人気No4
JavaScript
JavaScriptで要素の表示・非表示を切り替える方法(display・visibility)を完全解説
No.5
Java&Spring記事人気No5
JavaScript
JavaScriptでフォームの値を取得する方法を徹底解説!valueプロパティの使い道
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptのライブラリとは?標準ライブラリと外部ライブラリの違いと使い方
No.7
Java&Spring記事人気No7
TypeScript
TypeScriptで最初に覚えたい基本構文まとめ
No.8
Java&Spring記事人気No8
TypeScript
TypeScriptでクライアントとサーバーのバリデーションを共通化する方法!初心者向けデータ検証入門