<>
はTypeScriptにおけるジェネリクスの型パラメータを定義するための記号です。この記号を使って、関数やクラス、インターフェースが柔軟に異なる型を扱えるようにします。
ジェネリクス関数の例
function identity<T>(arg: T): T {
return arg;
}
const result1 = identity<number>(10); // Tがnumberとして扱われる
const result2 = identity<string>("hello"); // Tがstringとして扱われる
-
identity<T>
:T
は型パラメータで、実際の型が渡されるまでのプレースホルダーです。 -
identity<number>(10)
: 呼び出し時に具体的な型を指定しています。
ジェネリクスの利点
- 型安全性: 型を明示することで、コンパイル時に型チェックが行われます。
- 再利用性: 同じロジックを異なる型に対して適用できます。
<>
はこのように型を抽象化し、柔軟に扱うための重要な構文です。
文法
ジェネリクスは、関数、クラス、インターフェース、型エイリアスで使用できます。通常、山括弧 <>
を使って定義します。
関数での使用
function identity<T>(arg: T): T {
return arg;
}
const result1 = identity<number>(10);
const result2 = identity<string>("hello");
-
T
は型パラメータで、実際の型が渡されるまで待つプレースホルダーです。 - 関数を呼び出すときに具体的な型を指定します。
クラスでの使用
class Box<T> {
contents: T;
constructor(value: T) {
this.contents = value;
}
}
const numberBox = new Box<number>(123);
const stringBox = new Box<string>("test");
- クラスのインスタンス化時に型を指定します。
インターフェースでの使用
interface Pair<T, U> {
first: T;
second: U;
}
const pair: Pair<number, string> = { first: 1, second: "apple" };
- 型を複数指定することも可能です。
典型的な使用例
配列操作
function getArray<T>(items: T[]): T[] {
return new Array<T>().concat(items);
}
const numberArray = getArray<number>([1, 2, 3]);
const stringArray = getArray<string>(["a", "b", "c"]);
- 任意の型の配列を操作する関数を作成できます。
制約付きジェネリクス
interface Lengthwise {
length: number;
}
function logLength<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
logLength("hello"); // OK
// logLength(123); // エラー: number型にはlengthプロパティがありません
-
T extends Lengthwise
により、T
はlength
プロパティを持つ型でなければならないという制約を設けています。