インデックスアクセス型 T[K]
| 対応: | TypeScript 2.1(2016) |
|---|
型のプロパティを別の型として取り出す機能です。`T[K]`という記法で、型`T`のキー`K`に対応する値の型を取得できます。ネストされた型の一部を参照したり、配列要素の型を取り出したりするのに便利です。
構文
// 型のプロパティ型を取り出します。 type プロパティ型 = オブジェクト型["プロパティ名"]; // 型パラメータを使って動的に取り出します。 type プロパティ型 = T[K]; // K extends keyof T の制約が必要です。 // 全プロパティの値型をユニオンとして取り出します。 type 全値型 = T[keyof T]; // 配列の要素型を取り出します。 type 要素型 = 配列型[number];
構文一覧
| 構文 | 概要 |
|---|---|
| T["key"] | 型Tの"key"プロパティの値型を取り出します。文字列リテラルでキーを指定します。 |
| T[K] | 型パラメータKを使って動的にプロパティ型を取り出します。 |
| T[keyof T] | 型Tのすべてのプロパティの値型をユニオン型として取り出します。 |
| T[number] | 配列型Tの要素型を取り出します。タプル型にも使えます。 |
| T["prop"]["nested"] | ネストされた型を連鎖してアクセスします。 |
サンプルコード
// 基本的なインデックスアクセス型
interface User {
id: number;
name: string;
address: {
city: string;
zipCode: string;
};
}
// プロパティの型を取り出します。
type UserId = User["id"]; // number
type UserName = User["name"]; // string
// ネストされた型を取り出します。
type UserAddress = User["address"]; // { city: string; zipCode: string; }
type UserCity = User["address"]["city"]; // string
// 複数キーのユニオンで複数のプロパティ型を取り出します。
type UserContact = User["name" | "id"]; // string | number
// T[keyof T]: 全プロパティの値型をユニオンとして取得します。
type AllUserValues = User[keyof User]; // number | string | { city: string; zipCode: string; }
// 配列の要素型を取り出します。
type Colors = ("red" | "green" | "blue")[];
type Color = Colors[number]; // "red" | "green" | "blue"
// タプル型の特定位置の型を取り出します。
type Pair = [string, number];
type First = Pair[0]; // string
type Second = Pair[1]; // number
// 実用例: APIレスポンスの特定フィールドの型を参照します。
interface ApiResponse {
status: "success" | "error";
data: {
users: User[];
total: number;
};
error?: {
code: number;
message: string;
};
}
type ResponseData = ApiResponse["data"]; // { users: User[]; total: number; }
type ErrorCode = NonNullable<ApiResponse["error"]>["code"]; // エラーオブジェクトのcodeプロパティの型(number)を取り出します。
type UsersList = ApiResponse["data"]["users"]; // User[]
type SingleUser = ApiResponse["data"]["users"][number]; // User
console.log("インデックスアクセス型の例をコンパイルしました");
実行すると次のように出力されます。
npx ts-node ts_index_access.ts インデックスアクセス型の例をコンパイルしました
概要
インデックスアクセス型は`T[K]`という記法で、型`T`のプロパティ`K`の型を取り出します。JavaScriptのオブジェクトアクセス(`obj["key"]`)と同じ見た目ですが、値ではなく「型」を取り出す点が異なります。
`T[keyof T]`は型のすべてのプロパティ値型をユニオンとして取得する便利なパターンです。`T[number]`は配列型の要素型を取り出すイディオムで、`string[]`に対して使うと`string`が得られます。
インデックスアクセス型は、大きなAPIレスポンスの型から必要な部分だけを参照するのに特に便利です。型定義を一箇所にまとめて、他の場所ではインデックスアクセス型で参照することで、型の変更が一箇所の修正で全体に反映されます。keyof / typeofやマップ型と組み合わせて使われることも多いです。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。