0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TypeScript初心者必見!ジェネリクスの理解を深めよう

Posted at

こんにちは!今回はTypeScriptの重要な概念であるジェネリクスについて解説していきます。ジェネリクスは型の問題を解決する強力なツールであり、型の安全性を維持しながらコードの再利用性と柔軟性を高めます。

1. ジェネリクスって何?

ジェネリクスとは、型システムの一部で、クラスや関数に柔軟性を持たせるためのツールです。ジェネリクスを使用することで、型情報(つまり、どのようなデータがコードに渡されるのか)を保持しながら、コードを抽象化・再利用することが可能になります。

例えば、次のようなジェネリック関数を考えてみましょう。

function identity<T>(arg: T): T {
    return arg;
}

この関数は、型を指定して呼び出すことができます。

let output = identity<string>("myString");
console.log(output);  // "myString"

また、型推論を利用して引数から型を自動的に推論することも可能です。

let output = identity("myString");
console.log(output);  // "myString"

2. ジェネリクスのメリット

ジェネリクスのメリットは、型の安全性の維持、コードの再利用、自己文書化にあります。

型の安全性

ジェネリクスを使用すると、関数やクラスが動作する型を制限することなく、コードを抽象化できます。これにより、コンパイル時に型安全性を保つことができます。

例えば、以下のジェネリック関数getArrayItemsは、任意の型の配列を引数に取り、その配列をそのまま返します。この関数は数値の配列、文字列の配列、オブジェクトの配列など、どのような型の配列に対しても使用することができます。

function getArrayItems<T>(arr: T[]): T[] {
    return arr;
}

let numArray = getArrayItems<number>([1, 2, 3, 4]);  // number[]
let strArray = getArrayItems<string>(['a', 'b', 'c']);  // string[]
let objArray = getArrayItems<{ id: number }>([{ id: 1 }, { id: 2 }]);  // { id: number }[]

コードの再利用

ジェネリクスを使用すると、特定の型に依存せずに関数やクラスを設計できます。これにより、さまざまな型で動作する一般的なコードを作成できます。

例えば、以下のGenericNumberクラスは、number型で動作するバージョンとstring型で動作するバージョンを同じコードで作成することができます。

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

let myNumber = new GenericNumber<number>();
myNumber.zeroValue = 0;
myNumber.add = function(x, y) { return x + y; };

let myString = new GenericNumber<string>();
myString.zeroValue = "";
myString.add = function(x, y) { return x + y; };

自己文書化

ジェネリクスは、関数やクラスがどのような型で動作するかを示すため、コードの可読性を向上させます。これにより、他の開発者がコードを理解しやすくなります。

3. ジェネリクス vs any

any型とジェネリクスの違いは、型の安全性を保つかどうかです。any型を使用すると、型の安全性が犠牲になる可能性があります。一方、ジェネリクスを使用すると、型の安全性を保ったままコードの再利用性と柔軟性を高めることができます。

let myVariable: any = 'Hello';
myVariable = 10;  // no error, but potentially unsafe!

function identity<T>(arg: T): T {
    return arg;
}
let output = identity<string>("myString");  // output is of type string

以上のように、ジェネリクスはコードの柔軟性と再利用性を高め、型の安全性を保つための強力なツールです。一般的には可能な限りジェネリクスを使用し、型の安全性を保つことが推奨されます。


以上、TypeScriptのジェネリクスについての解説を終わります。この記事がTypeScriptのジェネリクスについて理解を深める手助けになれば幸いです。より詳細な情報を得たい場合は、公式ドキュメントを参照してください。それでは、Happy Coding!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?