言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

TypeScript辞典

  1. トップページ
  2. TypeScript辞典
  3. instanceofガード

instanceofガード

対応: TypeScript 1.0(2014)

『instanceof』ガードは、オブジェクトが特定のクラスのインスタンスであるかを確認し、型を絞り込む型ガードです。クラス階層を持つコードでよく使われます。

構文

x instanceof ClassName

サンプルコード

class TextProcessor {
  process() { return 'テキスト処理完了'; }
}

class ImageProcessor {
  convert() { return '画像変換完了'; }
}

function handle(processor: TextProcessor | ImageProcessor): string {
  if (processor instanceof TextProcessor) {
    // ここでは processor: TextProcessor
    return processor.process();
  } else {
    // ここでは processor: ImageProcessor
    return processor.convert();
  }
}

// クラス階層での絞り込み
class BaseHandler {
  name: string;
  constructor(name: string) { this.name = name; }
}

class PriorityHandler extends BaseHandler {
  priority() { return `${this.name} は優先ハンドラです`; }
}

function dispatch(handler: BaseHandler): void {
  if (handler instanceof PriorityHandler) {
    // ここでは handler: PriorityHandler
    console.log(handler.priority());
  } else {
    // ここでは handler: BaseHandler(PriorityHandler 以外)
    console.log(`${handler.name} が登録されました`);
  }
}

// Error クラスの判別
function handleError(err: unknown): string {
  if (err instanceof TypeError) {
    return `Type error: ${err.message}`;
  }
  if (err instanceof RangeError) {
    return `Range error: ${err.message}`;
  }
  return 'Unknown error';
}

概要

『instanceof』は JavaScript のネイティブ演算子であり、コンストラクタのプロトタイプチェーンをたどってインスタンス確認を行います。TypeScript はこれを型ガードとして認識し、条件ブロック内で自動的に型を絞り込みます。

インターフェースや型エイリアスは実行時に存在しないため、『instanceof』で確認することはできません。インターフェースをベースにした絞り込みには in 演算子ガードユーザー定義型ガード を使います。

また、catch ブロックで補足した例外は『unknown』型として扱われます。エラーの種別を判定して適切に処理するには、『instanceof Error』や『instanceof TypeError』のような確認が有効です。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。