TypeScript 速習チュートリアル

TypeScript ユーティリティ型

TypeScriptには、一般的な型操作(Type Manipulation)を補助する便利な型が数多く標準搭載されています。これらは一般的にユーティリティ型(Utility Types)と呼ばれます。

この章では、現場で最もよく使われる主要なユーティリティ型を解説します。

1. Partial

Partial は、オブジェクトのすべてのプロパティを任意(Optional)に変更します。

interface Point {
  x: number;
  y: number;
}

// `Partial` を使うことで x と y が任意になります
let pointPart: Partial<Point> = {}; 
pointPart.x = 10;

2. Required

Required は、オブジェクトのすべてのプロパティを必須(Required)に変更します。Partial の逆の動作です。

interface Car {
  make: string;
  model: string;
  mileage?: number; // 元々は任意
}

let myCar: Required<Car> = {
  make: 'Ford',
  model: 'Focus',
  mileage: 12000 // `Required` により、mileage の定義が強制されます
};

3. Record

Record は、特定のキーの型と値の型を持つオブジェクト型を定義する際のショートカットです。

const nameAgeMap: Record<string, number> = {
  'Alice': 21,
  'Bob': 25
};

Record<string, number> は、インデックスシグネチャを用いた { [key: string]: number } と同等です。

4. Omit

Omit は、オブジェクト型から特定のキーを削除して新しい型を作成します。

interface Person {
  name: string;
  age: number;
  location?: string;
}

// age と location を除外
const bob: Omit<Person, 'age' | 'location'> = {
  name: 'Bob'
  // `Omit` によって age と location が削除されているため、ここでは定義できません
};

5. Pick

Pick は、オブジェクト型から指定したキーのみを抽出して新しい型を作成します。

interface Person {
  name: string;
  age: number;
  location?: string;
}

// name だけを抽出
const bob: Pick<Person, 'name'> = {
  name: 'Bob'
  // `Pick` は name のみを保持するため、age や location は削除されており、定義できません
};

6. Exclude

Exclude は、ユニオン型(Union Types)から特定の型を取り除きます。

type Primitive = string | number | boolean
// string を除外
const value: Exclude<Primitive, string> = true; // string は型から削除されているため、ここでは使用できません

7. ReturnType

ReturnType は、関数型の戻り値の型を抽出します。

type PointGenerator = () => { x: number; y: number; };

// 関数の戻り値である { x: number; y: number; } 型を抽出
const point: ReturnType<PointGenerator> = {
  x: 10,
  y: 20
};

8. Parameters

Parameters は、関数型の引数の型を配列として抽出します。

type PointPrinter = (p: { x: number; y: number; }) => void;

// 引数の型を配列として取得し、その最初の要素 [0] を使用
const point: Parameters<PointPrinter>[0] = {
  x: 10,
  y: 20
};

9. Readonly

Readonly は、すべてのプロパティを読み取り専用(Readonly)にした新しい型を作成します。一度値を代入すると、その後は変更できなくなります。

TypeScriptはコンパイル時にこの制約をチェックしますが、JavaScriptにコンパイルされた後は理論上上書きが可能です(あくまで開発時の安全性を高めるためのものです)。

interface Person {
  name: string;
  age: number;
}

const person: Readonly<Person> = {
  name: "Dylan",
  age: 35,
};

// エラー: 'name' は読み取り専用プロパティであるため、代入できません。
person.name = 'Israel';