0Pricing
TypeScript Academy · レッスン

instanceofとinによるナローイング

クラスのインスタンスとオブジェクトの形状を絞り込みます。

「instanceofとinによるナローイング」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全4レッスンが含まれています。

はじめに

`instanceof` はクラスのインスタンスを絞り込み、`in` はプロパティの存在に基づいてオブジェクト型を絞り込みます。どちらも複雑なユニオンを扱うために不可欠です。

instanceof による絞り込み

`instanceof` を使って、値がクラスのインスタンスかどうかをチェックします。TypeScript は型をそのクラスに絞り込みます。
function handle(err: Error | string) {
  if (err instanceof Error) {
    console.log(err.message); // err: Error
  } else {
    console.log(err); // err: string
  }
}

カスタムクラスでの instanceof

instanceof は独自のクラスでも機能します。
class Dog { bark() { return 'Woof'; } }
class Cat { meow() { return 'Meow'; } }
function speak(pet: Dog | Cat) {
  if (pet instanceof Dog) pet.bark();
  else pet.meow();
}

instanceof はインターフェースでは使えない

インターフェースは実行時に消去されます。そのため instanceof はインターフェースでは使えず、クラスに対してのみ使用できます。

in 演算子

`in` を使って、オブジェクトにプロパティが存在するかどうかをチェックします。TypeScript は、そのプロパティを持つメンバーにユニオンを絞り込みます。
type Fish = { swim(): void };
type Bird = { fly(): void };
function move(animal: Fish | Bird) {
  if ('swim' in animal) animal.swim();
  else animal.fly();
}

省略可能なプロパティに対する in による絞り込み

`in` は省略可能なプロパティに対しても絞り込みを行います。プロパティが存在する可能性のあるユニオンメンバーに絞り込みます。
type A = { x?: number };
type B = { y: number };
function process(v: A | B) {
  if ('x' in v) {
    // v: A (has optional x)
  }
}

instanceof と in の組み合わせ

複雑な型の判別では、両方の絞り込み手法を組み合わせられます。
function describe(v: Error | { message: string }) {
  if (v instanceof Error) console.log('Error:', v.stack);
  else if ('message' in v) console.log('Object:', v.message);
}

判別可能なユニオンでの in

ユニオンメンバーに判別子がない場合、`in` チェックで同じように型を絞り込めます。
type Square = { side: number };
type Circle = { radius: number };
function area(s: Square | Circle): number {
  return 'side' in s ? s.side ** 2 : Math.PI * s.radius ** 2;
}

catch ブロックでの instanceof

catch ブロックで instanceof を使うと、エラーの型を区別できます。
try {
  await fetchData();
} catch (err) {
  if (err instanceof NetworkError) { /* retry */ }
  else if (err instanceof AuthError) { /* redirect */ }
  else throw err;
}

Object.prototype チェックと in の比較

`key in obj` と `Object.prototype.hasOwnProperty.call(obj, key)` はどちらもプロパティの存在をチェックします。ただし `in` は継承されたプロパティにも一致します。

絞り込みの優先順位

複数の絞り込みチェックが適用される場合、TypeScript は絞り込まれた型を交差させ、可能な限り具体的な型にします。

確認問題

TypeScript でインターフェース型の絞り込みに `instanceof` を使えないのはなぜですか。

まとめ

`instanceof` は実行時にクラスのインスタンスを絞り込みます。`in` はプロパティの存在に基づいてオブジェクトのユニオンを絞り込みます。クラス階層や構造的なオブジェクトのユニオンを扱うときは、両方を使います。

よくある質問

「instanceofとinによるナローイング」レッスンは無料ですか?

はい。「instanceofとinによるナローイング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全4レッスンが含まれています。

「instanceofとinによるナローイング」で何を学びますか?

クラスのインスタンスとオブジェクトの形状を絞り込みます。 ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「instanceofとinによるナローイング」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. typeofと真偽値によるナローイング
  2. instanceofとinによるナローイング
  3. ユーザー定義型ガード関数
  4. neverによる網羅性チェック
← TypeScript Academyに戻る