TypeScript ジェネリック型解説
TypeScript で <T>
は ジェネリック型パラメータ を表します。ジェネリック型パラメータは、コードの再利用性を高めるための強力なツールです。
ジェネリック型パラメータとは?
- 型安全性を維持
ジェネリック型パラメータを使うことで、コンパイル時に型チェックが行われ、誤ったデータの操作を防ぎます。 - 再利用可能なコード
さまざまなデータ型に対して同じコードを使用できます。 - 柔軟な型定義
<T>
のようなプレースホルダーを使って、関数やクラスの型を柔軟に定義できます。
具体例
function identity<T>(arg: T): T {
return arg;
}
let output1 = identity<string>("myString"); // output1 の型は string
let output2 = identity<number>(100); // output2 の型は number
この例では、identity
関数はジェネリック型パラメータ T
を使用しています。これにより、任意のデータ型を受け取り、同じデータ型を返すことができるようになります。
function identity<T>(arg: T): T {
return arg;
}
let output1 = identity<string>("myString"); // output1 の型は string
let output2 = identity<number>(100); // output2 の型は number
この identity
関数は、任意のデータ型 T
を受け取り、同じデータ型を返します。これにより、さまざまなデータ型に対して同じ関数を再利用できます。
ジェネリック型を使ったクラス
class GenericNumber<T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y ; };
この GenericNumber
クラスは、任意の数値型 T
を扱うことができます。
ジェネリックインターフェース
interface IdentityFn<T> {
(arg: T): T;
}
let myIdentity: IdentityFn<number> = function(x) {
return x;
};
この IdentityFn
インターフェースは、任意のデータ型 T
を受け取り、同じデータ型を返す関数を定義します。
ジェネリックの利点
- 柔軟性
さまざまなデータ型を扱うことができます。 - 型安全性
コンパイル時に型チェックが行われ、誤ったデータの操作を防ぎます。 - コードの再利用性
同じコードをさまざまなデータ型に対して使用できます。
ジェネリック型を使わない場合、以下のような方法が考えられますが、それぞれに制限があります。
オーバーロード
function identityString(arg: string): string {
return arg;
}
function identityNumber(arg: number): number {
return arg;
}
この方法では、同じ機能を持つ関数をデータ型ごとに定義する必要があります。これは冗長で、メンテナンスが難しくなります。
any 型の使用
function identityAny(arg: any): any {
return arg;
}
any
型を使うことで、任意のデータ型を受け取ることができますが、型チェックが失われ、潜在的なエラーが発生しやすくなります。
typescript