TypeScriptにおけるジェネリック制約での型パラメータの使用

TypeScriptでは、ある型パラメータを別の型パラメータによって制約することも可能です。 これは、あるオブジェクトから別のオブジェクトへプロパティをコピーする際に、 余分なプロパティが渡されないように保証する必要がある場合に便利です。

次の例を見てみましょう。変数の長さを定義する関数myFuncに戻ります。

typescriptfunction myFunc <T> (data: T): T {
  console.log(data.length); // エラー
  return data;
}

しかし今回は、この関数がlengthプロパティを持つ型でのみ動作するようにしたいとします。 そのためには、数値型のlengthプロパティを定義したインターフェースILengthを作成します。

typescriptinterface ILength {
  length: number;
}

次に、関数内でextendsキーワードを使用してILengthを継承するジェネリック型を定義します。

typescriptfunction myFunc <T extends ILength> (data: T): T {
  console.log(data.length);
  return data;
}

完成したコードは以下の通りです。

typescriptinterface ILength {
  length: number;
}

function myFunc <T extends ILength> (data: T): T {
  console.log(data.length);
  return data;
}

関数の動作を確認し、文字列の長さを求めてみましょう。

typescriptconsole.log(myFunc('abcde'));

コードの実行結果:

typescript5
'abcde'

次に、パラメータとして配列を渡してみます。

typescriptconsole.log(myFunc(['a', 'b', 'c']));

コードの実行結果:

typescript3
[ 'a', 'b', 'c' ]