1Dateと文字列のどちらかを受け取る
instanceof による絞り込みの最も基本の形です。value instanceof Date が真のブロックでは Date のメソッドが安全に呼べ、偽の側では自動的に string に絞り込まれます。日付が確定していればDate、未定なら文字列、という実務によくあるデータをそのまま扱えます。
function formatSchedule(start: Date | string): string {
if (start instanceof Date) {
// ここでは Date に絞り込まれ、日付のメソッドが使える
return start.getMonth() + 1 + "月" + start.getDate() + "日 開始";
}
// ここでは string に絞り込まれる
return start + "(日程調整中)";
}
console.log(formatSchedule(new Date(2026, 6, 1)));
console.log(formatSchedule("未定"));
21件でも配列でも受け取れる引数をそろえる
配列は Array というコンストラクタから作られるオブジェクトなので、instanceof Array で判定できます。「タグは1個なら文字列で、複数なら配列で渡せる」という柔軟な引数を、関数の入口で必ず配列にそろえる正規化は、設定値やAPI引数の処理でよく使うパターンです。
function normalizeTags(tags: string | string[]): string[] {
if (tags instanceof Array) {
return tags; // ここでは string[] に絞り込まれる
}
return [tags]; // ここでは string なので配列に包む
}
console.log(normalizeTags("news"));
console.log(normalizeTags(["tech", "ai", "web"]));
// どちらで渡しても、以降は配列として同じに扱える
console.log(normalizeTags("sports").length);
console.log(normalizeTags(["a", "b"]).length);
3文字列とRegExpのどちらでも検索できる関数
正規表現 RegExp も new で作られる組み込みオブジェクトなので instanceof で判定できます。単純な部分一致なら文字列、パターン検索なら正規表現と、呼び出す側が手軽さと厳密さを選べる検索関数は、ログのフィルタリングなどで実際によく見る形です。
function matchesPattern(text: string, pattern: string | RegExp): boolean {
if (pattern instanceof RegExp) {
return pattern.test(text); // RegExp に絞り込まれ test が呼べる
}
return text.indexOf(pattern) !== -1; // string なら部分一致で調べる
}
console.log(matchesPattern("order-2026-001", "2026"));
console.log(matchesPattern("order-2026-001", /^order-/));
console.log(matchesPattern("memo.txt", /[0-9]{4}/));
4Errorを値として返して呼び出し側で判定する
throw する代わりに Error オブジェクトを戻り値として返し、呼び出し側が instanceof Error で成否を判定するスタイルです。失敗が戻り値の型(number | Error)に現れるため、エラー処理を書き忘れるとコンパイルが通らないのが利点で、入力の解析処理などで使われます。
function parseAmount(input: string): number | Error {
const value = Number(input);
if (Number.isNaN(value)) {
return new Error("数値として読めません: " + input);
}
return value;
}
function describeResult(parsed: number | Error): string {
if (parsed instanceof Error) {
return "失敗: " + parsed.message; // Error に絞り込まれる
}
return "成功: " + (parsed + 200) + "円(送料込)"; // number に絞り込まれる
}
console.log(describeResult(parseAmount("1980")));
console.log(describeResult(parseAmount("abc")));
5catchした値をエラーの種類で分類する
catch で受け取った値の型は不明なので、instanceof で種類を確かめてから処理を分けます。RangeError は Error の一種なので、具体的な種類から順に判定するのがコツです。外部APIやファイル読み込みの失敗を「想定内のエラーか、想定外か」で分類する実務の定番です。
function readConfigValue(key: string): number {
if (key === "missing") {
throw new RangeError("設定が見つかりません: " + key);
}
if (key === "broken") {
throw new TypeError("設定の形式が不正です: " + key);
}
return 100;
}
function safeRead(key: string): string {
try {
return key + " = " + readConfigValue(key);
} catch (caught) {
if (caught instanceof RangeError) {
return "未設定: " + caught.message; // 具体的な種類から先に判定する
}
if (caught instanceof Error) {
return "想定外のエラー: " + caught.message;
}
return "不明なエラー";
}
}
console.log(safeRead("timeout"));
console.log(safeRead("missing"));
console.log(safeRead("broken"));