NINOMIN BLOG

TypeScript Generics入門 - 型安全なコードを書く

2 min read
TypeScript
programming
tech

TypeScript Generics 入門 - 型安全なコードを書く

はじめに

TypeScript の Generics(ジェネリクス)は、型の再利用性を高め、型安全なコードを書くための強力な機能。


Generics とは

Generics を使うと、関数やクラスで扱う型を「あとから決める」ことができる。

基本的な例

typescript
// Genericsなし - any型で型安全性が失われる
function identity(arg: any): any {
  return arg;
}

// Genericsあり - 型安全性を保ちつつ柔軟
function identity<T>(arg: T): T {
  return arg;
}

// 使用例
const num = identity<number>(42); // number型
const str = identity<string>("hello"); // string型

実践的な使用例

1. 配列操作関数

typescript
function getFirst<T>(arr: T[]): T | undefined {
  return arr[0];
}

const numbers = [1, 2, 3];
const firstNum = getFirst(numbers); // number | undefined

const strings = ["a", "b", "c"];
const firstStr = getFirst(strings); // string | undefined

2. API レスポンスの型定義

typescript
interface ApiResponse<T> {
  data: T;
  status: number;
  message: string;
}

interface User {
  id: number;
  name: string;
}

// 使用例
const userResponse: ApiResponse<User> = {
  data: { id: 1, name: "Ryo" },
  status: 200,
  message: "Success",
};

制約(Constraints)

Generics に制約を加えることで、特定のプロパティを持つ型のみを受け入れる。

typescript
interface HasLength {
  length: number;
}

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

logLength("hello"); // OK - stringはlengthを持つ
logLength([1, 2, 3]); // OK - 配列はlengthを持つ
logLength({ length: 5 }); // OK
// logLength(123);      // Error - numberはlengthを持たない

まとめ

  • Generics は型の再利用性を高める
  • 型安全性を保ちながら柔軟なコードが書ける
  • 制約を使うことで、より厳密な型チェックが可能