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';