TypeScript 型ガード

型ガードは TypeScript の強力な機能で、開発者が実行時チェックを実行して変数の型を絞り込むことができます。これにより、より正確な型情報が確保され、より安全で予測可能なコードが実現します。この記事では、型ガードとは何か、そしてそれを効果的に使用する方法について説明します。

タイプガードとは何ですか?

型ガードは、実行時チェックを実行し、TypeScript が変数のより具体的な型を推測できるようにする式です。型ガードは、特にユニオン型を扱うときに、異なる型を区別するのに役立ちます。型ガードは、次のようなさまざまな手法を使用して実装できます。

  • ユーザー定義型述語
  • 型アサーション
  • インスタンスチェック
  • typeof演算子の使用
  • in演算子の使用

ユーザー定義型述語

ユーザー定義型述語は、ブール値を返す関数であり、チェックされる変数の型を示す特別な戻り値の型を持ちます。作成および使用方法は次のとおりです。

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

function printString(value: any) {
  if (isString(value)) {
    console.log(value.toUpperCase()); // TypeScript knows value is a string here
  } else {
    console.log('Not a string');
  }
}

上記の例では、isString はユーザー定義の型述語であり、TypeScript が valueif ブロック内の文字列であることを理解するのに役立ちます。

型アサーション

型アサーションは、TypeScript に変数を特定の型として扱うように指示します。このメソッドは実行時チェックを実行せず、TypeScript コンパイラに型を通知します。例:

function printLength(value: any) {
  console.log((value as string).length); // Assert value is a string
}

この例では、value as string は、実行時チェックを実行せずに、value が文字列であると想定するように TypeScript に指示します。

インスタンスチェック

インスタンス チェックは、オブジェクトが特定のクラスのインスタンスであるかどうかを判断するために使用されます。これは、クラスを操作するときにタイプを絞り込むのに役立ちます。

class Dog {
  bark() { console.log('Woof'); }
}

class Cat {
  meow() { console.log('Meow'); }
}

function speak(animal: Dog | Cat) {
  if (animal instanceof Dog) {
    animal.bark(); // TypeScript knows animal is a Dog here
  } else {
    animal.meow(); // TypeScript knows animal is a Cat here
  }
}

この例では、instanceof 演算子は、TypeScript がクラスに基づいて animal の型を推測するのに役立ちます。

typeof 演算子の使用

typeof 演算子は、stringnumberboolean などのプリミティブ型をチェックするために使用できます。

function processValue(value: string | number) {
  if (typeof value === 'string') {
    console.log(value.toUpperCase()); // TypeScript knows value is a string here
  } else {
    console.log(value.toFixed(2)); // TypeScript knows value is a number here
  }
}

ここで、typeof は、valuestringnumber かをチェックし、それに応じて型を絞り込むために使用されます。

in 演算子の使用

in 演算子は、オブジェクト内のプロパティの存在をチェックします。これは、共通のプロパティを共有する型を区別するのに役立ちます。

interface Bird {
  fly: () => void;
}

interface Fish {
  swim: () => void;
}

function move(creature: Bird | Fish) {
  if ('fly' in creature) {
    creature.fly(); // TypeScript knows creature is a Bird here
  } else {
    creature.swim(); // TypeScript knows creature is a Fish here
  }
}

この例では、in 演算子は、メソッドの存在に基づいて、TypeScript が creatureBird であるか Fish であるかを判断するのに役立ちます。

結論

TypeScript の型ガードは、型を柔軟かつ安全に操作するための重要なツールです。より正確な型チェックが可能になり、さまざまなシナリオで正しい型が使用されるようにすることで実行時エラーを防ぐことができます。型ガードを効果的に理解して使用すると、より堅牢で保守しやすい TypeScript コードを作成できます。