TypeScriptでtypeof・instanceofを使った型チェックの書き方
生徒
「先生、TypeScriptで変数の中身がどんな型かを調べる方法ってありますか?」
先生
「良い質問ですね。TypeScriptでは、typeofやinstanceofを使って、変数の型をチェックすることができます。」
生徒
「型をチェックすると、何ができるようになるんですか?」
先生
「それを使えば、条件によって安全に処理を分けたり、エラーを防いだりできるんです。では、順番に使い方を見ていきましょう。」
1. typeofとは?
typeof(タイプオブ)は、JavaScriptやTypeScriptで「変数のデータの種類(型)」を調べるための演算子です。TypeScriptでは、これを使って「値が文字列なのか、数値なのか」などを判定できます。
例えば、入力されたデータが文字なのか数字なのかを区別したいときに役立ちます。
▶ typeofを使った基本例
let value: string | number = "Hello";
if (typeof value === "string") {
console.log("文字列です");
} else if (typeof value === "number") {
console.log("数値です");
}
このコードでは、valueが文字列のときと数値のときで処理を分けています。typeofを使うと、TypeScriptが自動的に型を絞り込んでくれるため、後の処理でも安全に扱えます。
▶ 実行結果
文字列です
上の例では、valueに文字列「Hello」が代入されているため、「文字列です」と出力されます。
ちなみに、typeofが返す値は次のような文字列になります。
"string":文字列"number":数値"boolean":真偽値"object":オブジェクト"undefined":未定義"function":関数
このように、typeofを使えば、簡単に値の種類を調べることができます。
2. instanceofとは?
次に紹介するのは、instanceof(インスタンスオブ)です。これは「その変数が、特定のクラスから作られたオブジェクトかどうか」を調べるための演算子です。
たとえば、プログラムでDogやCatといったクラスを作り、それぞれを区別して処理したいときに使います。
▶ instanceofの使い方
class Dog {
bark() {
console.log("ワンワン!");
}
}
class Cat {
meow() {
console.log("ニャー!");
}
}
let pet: Dog | Cat = new Dog();
if (pet instanceof Dog) {
pet.bark();
} else if (pet instanceof Cat) {
pet.meow();
}
この例では、petがDogクラスのインスタンス(実体)であればbark()を、Catであればmeow()を呼び出しています。
▶ 実行結果
ワンワン!
このように、instanceofを使うことで、クラスごとの動きを安全に区別できます。
3. typeofとinstanceofの違い
ここまでの説明で、どちらも「型を調べる」という点は同じですが、実際には使う場面が異なります。違いを整理しておきましょう。
| 比較項目 | typeof | instanceof |
|---|---|---|
| 使う対象 | 基本型(string, number, booleanなど) | クラス・オブジェクト |
| 返り値 | 文字列("string"など) | 真偽値(true / false) |
| 使用例 | typeof x === "string" |
x instanceof MyClass |
たとえば、ユーザー入力のように文字や数値をチェックしたいときはtypeof、オブジェクトの種類を確認したいときはinstanceofが適しています。
4. 型ガードとしてのtypeof・instanceof
TypeScriptでは、これらの演算子を「型ガード(Type Guard)」として使うことができます。型ガードとは、「条件分岐によって型を安全に絞り込む」機能のことです。
例えば、typeofで数値かどうかを判定した場合、TypeScriptは「この条件の中ではnumber型だ」と認識してくれます。
function printValue(value: string | number) {
if (typeof value === "string") {
console.log("文字列の長さ:", value.length);
} else {
console.log("数値の2倍:", value * 2);
}
}
printValue("Hello");
printValue(10);
▶ 実行結果
文字列の長さ: 5
数値の2倍: 20
このように型を安全に使い分けることで、エラーを防ぎつつ柔軟なコードが書けます。
5. 理解するコツ
typeofとinstanceofは、TypeScriptで安全なプログラムを書くための基本テクニックです。どちらも型を見分けるための「型チェック」に使われますが、使う対象が異なります。
- 数値や文字列などの「基本データ型」→
typeof - クラスやオブジェクトのインスタンス→
instanceof
型を確認することで、プログラムが意図通りに動くように守ることができるので、初心者のうちから慣れておくと安心です。
まとめ
TypeScriptでプログラムを書くとき、型の違いを正しく理解し、安全に処理を分岐させることはとても大切です。とくに、値が文字列なのか数値なのかを区別したい場面や、オブジェクトがどのクラスから作られたものなのかを判定したい場面では、typeofやinstanceofを使った型チェックが欠かせません。この記事では、基本的な使い方から実務で役立つ考え方まで、段階を追って理解できるように説明してきました。ここでは改めて全体を振り返りながら、型チェックのポイントを整理しておきましょう。
▶ typeofでの型チェックの振り返り
typeofは、ひとつの値がどんな基本型に属しているかを調べるための演算子で、文字列、数値、真偽値などの基本的な判定に非常に強い力を発揮します。プログラムの中で文字列だけに使えるメソッドを呼びたいときや、数値だけを使って計算したいときなど、基本的な処理の安全性を高めてくれる便利な仕組みです。とくに、ユーザー入力のようにデータの種類が曖昧になる場面で、typeofの存在は欠かせません。
function check(value: string | number) {
if (typeof value === "string") {
console.log("入力は文字列です:", value);
} else {
console.log("入力は数値です:", value);
}
}
check("こんにちは");
check(42);
このようにtypeofを使うと、TypeScriptは条件の中で値の型を自動的に絞り込んでくれるため、プログラムの可読性と安全性が大幅に向上します。初心者にとって理解しやすい構文でありながら、実務でも確実に役立つ重要な技術です。
▶ instanceofでの型チェックの振り返り
instanceofは、ある変数が特定のクラスから生成されたオブジェクトかどうかを判定するための演算子です。クラスベースの開発ではとくに役立ち、複数のクラスをまとめて扱うときの必須テクニックでもあります。ゲーム開発でキャラクターの種類を区別する場合や、フロントエンドでUI部品を動的に切り替える場合など、さまざまな場面で力を発揮します。
class Dog {
bark() { console.log("ワンワン"); }
}
class Cat {
meow() { console.log("ニャー"); }
}
function sound(pet: Dog | Cat) {
if (pet instanceof Dog) {
pet.bark();
} else {
pet.meow();
}
}
sound(new Dog());
sound(new Cat());
このように、instanceofを使うことでオブジェクトの種類を安全に判定でき、クラスごとの固有のメソッドを確実に呼び分けることができます。複雑なロジックを扱うアプリケーションではとくに重要な知識となります。
▶ typeofとinstanceofの使い分けのポイント
TypeScriptを扱ううえで、typeofとinstanceofを正しく使い分けることは重要です。typeofは文字列や数値などの基本型を確認するのに適しており、instanceofはクラスを用いたオブジェクトを判別するのに向いています。それぞれ役割が違うため、用途に合わせて選択することでプログラムの安定性と可読性が向上します。
とくに型ガードとして利用する場合、TypeScriptが条件分岐をもとに型を絞り込んでくれる点を理解しておくと、より安全で柔軟なコードを書くことができるようになります。初心者のうちは「どの場面で何を使うべきか」を迷いやすい部分ですが、実際に手を動かしながら型の違いを意識していくことで、一歩ずつ確実に理解が深まっていきます。
▶ 学んだ知識を活用するためのサンプルコード
ここでは、typeofとinstanceofを組み合わせて使う少し応用的なサンプルを紹介します。複数のデータ形式をまとめて扱う場面で、型チェックをどのように役立てるかを確認できます。
class Message {
constructor(public text: string) {}
}
function handleInput(input: string | number | Message) {
if (typeof input === "string") {
console.log("文字入力:", input.toUpperCase());
} else if (typeof input === "number") {
console.log("数値入力:", input * 10);
} else if (input instanceof Message) {
console.log("メッセージ入力:", input.text);
}
}
handleInput("hello");
handleInput(7);
handleInput(new Message("こんにちは"));
このサンプルのように、複数のデータを一つの関数で柔軟に扱えるようになると、TypeScriptの型システムを活かした堅牢な設計が身につきます。型チェックは難しそうに見えますが、一つずつ丁寧に理解していくことで、必ず習得できる技術です。
生徒
「先生、今回の内容で、typeofとinstanceofの違いがようやく分かってきました!」
先生
「よかったですね。型を正しく判別できると、プログラム全体がとても書きやすくなりますよ。安全性も上がりますしね。」
生徒
「typeofは基本型、instanceofはクラスの判定に使うという点も覚えました。」
先生
「その通りです。これらを使いこなせるようになれば、TypeScriptの理解はさらに深まりますよ。次のステップでは、もっと複雑なデータの扱い方にも挑戦できますね。」