TypeScript のジェネリクス (Generics)を使用した関数・クラスを解説!

こんにちは!駆け出しエンジニアのガッキー(@ExplorerZine)です。

今回は TypeScript のジェネリクスについてご紹介します!

今回も一緒に学んでいきましょう~

ジェネリクスとは?

ジェネリクス (generics)とは、

具体的な型を決めずに汎用的なコード記述できる TypeScript の機能です。

関数やクラスを作成する際に、型をパラメーターとして指定でき、

同じ関数やクラスを異なる型で再利用できるようになります。

ジェネリクスの書き方・基本構文!

早速ジェネリクスの基本構文をみてみましょう!

function 関数名<T>(パラメータ: T): T {
  // パラメータに対する処理
  return パラメータ;
}

このというように型のパラメーターを定義し <T> の部分は

関数を呼び出す際に型パラメーターを指定して使用することができます。

ジェネリクス関数の使い方!

では実際の使い方を見てみましょう!

ジェネリクスを使わない場合の関数

function echoString(value: string): string {
  return value;
}

function echoNumber(value: number): number {
  return value;
}

まずは、シンプルな文字列と数字を出力する関数を定義してみました!

ジェネリクスを使った関数

function echo<T>(value: T): T {
  return value;
}

// resultStringはstring型
const resultString = echo<string>("Hello, TypeScript!");

// 型推論によりresultNumberはnumber型になる
const resultNumber = echo(42);

上記の2つの関数をジェネリクスを使った関数に置き換えて使用してみます!

echo 関数を呼び出す際にはresultStringのようにを使用して型を指定して呼び出すこともできますし、

resultNumberのように型推論によって自動で数値型を指定をすることもできます!

ジェネリクスクラスの使い方

続いてジェネリクスを使用したクラスを見ていきましょう!

ジェネリクスを使わないクラス

class StringStorage {
  private data: string[] = [];

  addItem(item: string) {
    this.data.push(item);
  }

  getItem(index: number): string {
    return this.data[index];
  }
}

class NumberStorage {
  private data: number[] = [];

  addItem(item: number) {
    this.data.push(item);
  }

  getItem(index: number): number {
    return this.data[index];
  }
}

まずはジェネリクスを使用しないクラスを見てみましょう!

StringStorage と NumberStorage という 2 つのクラスがあります。

それぞれ、配列に値を格納する関数と、値を返す関数が定義されていますが、

型ごとに別々のクラスが定義されていて、コードが冗長です。

ジェネリクスを使用したクラス

class Storage<T> {
    private data: T[] = [];

    addItem(item: T) {
        this.data.push(item);
    }

    getItem(index: number): T {
        return this.data[index];
    }
}

続いてジェネリクスを使用した場合を見ていきましょう!

上記の Storage クラスでは、

パラメータ を受け取り任意の型データを使用することができます。

ジェネリクスを使用しない場合と比べて、

コードがシンプルになり、複数のクラスを作る必要がなくなります!

const stringStorage = new Storage<string>();
stringStorage.addItem("Hello");
const stringValue = stringStorage.getItem(0);

const numberStorage = new Storage<number>();
numberStorage.addItem(42);
const numberValue = numberStorage.getItem(0);

上記のコードでは、stringStorage と numberStorage は、

同じ Storage クラスのインスタンスですが、異なる型のデータを扱うことができます。

コードの再利用ができますね!

まとめ

いかがでしたか??

TypeScript の型推論についてご紹介してきました!

引き続きブログをお楽しみいただければ嬉しいです。

よかったら Twitter も@ExplorerZine覗いてみてくださいね ♪

これからも一緒に学習しましょう~

🔽 デスクツアー開催しました 🔽

by
関連記事