🐶

【TypeScript】Generics(ジェネリックス)型について

2024/08/07に公開

Genericsとは何か?

ジェネリックは、プログラミングにおいて、データの型を具体的に指定せずに抽象化する手法のことを指します。これにより、再利用可能で柔軟なコードを作成することができます。
ジェネリックを使うと、関数やクラスが任意のデータ型を受け取ることができ、コードの再利用性が向上します。ジェネリックは、コンパイル時に型の安全性を保証し、実行時の型エラーを防ぐのに役立ちます。

Genericsの基本

ジェネリックは、プレースホルダー(通常はTなどの記号)を使用して、関数やクラスがさまざまな型で動作するようにします。以下は、ジェネリックの基本的な使い方を示す例です。

Generics関数

ジェネリック関数は、さまざまなデータ型に対して同じロジックを適用する関数です。

// T は任意の型を表すプレースホルダー
function identity<T>(arg: T): T {
  return arg;
}

// 使用時に型を指定
let output1 = identity<string>("Hello");  // string 型
let output2 = identity<number>(42);       // number 型

この例では、identity関数は引数として任意の型Tを受け取り、そのまま返します。使用時に具体的な型を指定することで、その型に対して型安全な操作が保証されます。

Genericsクラス

class GenericNumber<T> {
  zeroValue: T;
  add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = (x, y) => x + y;

この例では、GenericNumberクラスは任意の型Tを扱います。インスタンスを作成する際に具体的な型を指定することで、その型に応じた操作が可能になります。

制約付きGenerics

以下は、オブジェクトのプロパティを取得するジェネリック関数の例です。

interface Lengthwise {
  length: number;
}

function logLength<T extends Lengthwise>(arg: T): T {
  console.log(arg.length);
  return arg;
}

logLength({ length: 10, value: 42 }); // OK
logLength(3); // エラー: 'number' 型に 'length' プロパティがない

複数のGenerics型

ジェネリック型は複数指定することもできます。以下は、キーと値のペアを処理する関数の例です。

function createPair<K, V>(key: K, value: V): [K, V] {
  return [key, value];
}

const pair = createPair<string, number>('age', 30); // 型は [string, number]
console.log(pair); // ['age', 30]

Genericsの利点

ジェネリックを使うことで、以下の利点が得られます。

  1. 再利用性の向上: ジェネリックは、異なる型に対して同じロジックを再利用できるため、コードの重複を減らし、メンテナンスを容易にします。
  2. 型安全性の向上: ジェネリックを使用すると、コンパイル時に型チェックが行われるため、実行時の型エラーを防ぐことができます。
  3. 柔軟性の向上: ジェネリックは、さまざまな型に対して柔軟に対応できるため、より汎用的なコードを書けます。

まとめ

ジェネリックは、関数やクラスが任意の型に対して動作するように抽象化する手法です。これにより、再利用性が高く、型安全なコードを書くことができます。ジェネリックを効果的に活用することで、より柔軟で堅牢なプログラムを作成することができます。

株式会社Xronotech

Discussion