2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScriptにおける型ガードと条件分岐の戦略:安全な型推論とコード分離設計

Posted at

概要

動的型言語であるJavaScriptでは、実行時に変数の型を正しく識別し、安全に扱うための明示的な制御構造が必要となる。
それが「型ガード(type guard)」である。

JavaScript単体では typeofinstanceof などのプリミティブな手段に限られるが、TypeScriptと組み合わせることで、型推論と条件分岐の連動による安全な制御フローを構築できる。

本稿では、JavaScriptおよびTypeScriptにおける型ガードの設計的活用法、条件分岐との連携、再利用可能な判定ロジックの分離戦略について解説する。


1. 型ガードの基本:typeof, instanceof

function print(value: string | number) {
  if (typeof value === 'string') {
    console.log(value.toUpperCase()); // ✅ stringと推論される
  } else {
    console.log(value.toFixed(2)); // ✅ numberと推論される
  }
}
  • typeof はプリミティブ型(string, number, boolean など)に適用
  • ✅ 型推論によってブロック内で型が絞り込まれる

2. オブジェクト判定には ininstanceof

class Dog {
  bark() {}
}
class Cat {
  meow() {}
}

function speak(pet: Dog | Cat) {
  if (pet instanceof Dog) {
    pet.bark();
  } else {
    pet.meow();
  }
}
  • instanceof はクラスベースの判定に強い
  • ✅ コンストラクタを利用したインスタンス識別が可能

3. カスタム型ガード(Type Predicate)

type Admin = { role: 'admin'; privileges: string[] };
type User = { role: 'user'; name: string };

function isAdmin(user: Admin | User): user is Admin {
  return user.role === 'admin';
}

function handle(user: Admin | User) {
  if (isAdmin(user)) {
    console.log(user.privileges);
  } else {
    console.log(user.name);
  }
}
  • ✅ 戻り値の型アノテーション user is Admin によって、ブロック内で明確な型が推論される
  • 複雑な条件判定ロジックを外部に分離可能

4. 再利用可能な型ガードの分離設計

export function isString(value: unknown): value is string {
  return typeof value === 'string';
}

export function isNonEmptyArray<T>(value: unknown): value is T[] {
  return Array.isArray(value) && value.length > 0;
}
  • ✅ 型ガード関数はライブラリ的に共通化できる
  • ✅ 各ドメインでの型制御を 関数単位で再利用可能に設計

5. 型ガードと条件分岐の戦略的分離

  • if (...) { typeof === ... && instanceof === ... && Array.isArray() && ... } のように複数条件を混在させない
  • ✅ 判定ロジックは型ガードに抽出し、主処理と条件処理を分離する

設計判断フロー

① 型の振る舞いに応じて処理を分岐させているか?

② 判定ロジックは読みやすく・再利用しやすいよう切り出されているか?

③ `typeof` / `instanceof` / `in` を正しく選択しているか?

④ ブロック内で型が明示されるように制御しているか?

⑤ 条件式が肥大化していないか? → 型ガードへ分離できないか?

よくあるミスと対策

typeof による不正な型判定(nullは "object")

→ ✅ null チェックは別途行い、typeofは補助的に使う


❌ 型判定ロジックが複雑化して分岐が読めない

→ ✅ 型ガード関数に切り出して整理・明示化


instanceof を配列などに対して使う

→ ✅ Array.isArray() を使用。型に適した判定を選択する


結語

型ガードとは「型を確認する」ためのものではない。
それは**“型に応じた安全な制御フローと、構造的に整理された条件設計を構築するための手段”**である。

  • 型推論を最大限に活かし、不要な型アサーションを排除
  • 判定ロジックは抽象化し、ドメインに応じて再利用可能に構築
  • 条件式をデザインの一部と捉え、その可読性と拡張性を常に意識する

JavaScriptにおける型ガード設計とは、
“動的な言語においても、安全性と構造を両立させるための条件制御戦略である。”

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?