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』のような確認が有効です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。