TypeScriptのExtract型で型の共通部分を抽出してみよう
- 作成日 2024.12.13
- TypeScript
- TypeScript
TypeScriptの`Extract`型は、2つの型から共通する部分だけを抽出するためのユーティリティ型です。これにより、特定の条件に一致する型だけを効率的に取り出すことができます。本記事では、`Extract`型の基本的な使い方から実践的な活用方法までを詳しく解説します。
Extract型とは?
`Extract`型は、指定した2つの型のうち共通する部分だけを新しい型として抽出する機能を提供します。構文は`Extract`で、`T`から`U`に含まれる部分を抽出します。
type Common = Extract<"a" | "b" | "c", "b" | "c" | "d">;
// Commonは"b" | "c"になりますExtract型の基本的な使い方
`Extract`型を使用することで、ユニオン型の中から特定の型に一致するものを取り出すことができます。以下は、基本的な例です。
type UnionA = "x" | "y" | "z";
type UnionB = "y" | "z" | "w";
type Shared = Extract<UnionA, UnionB>;
// Sharedは"y" | "z"になりますExtract型とユニオン型の活用
ユニオン型と`Extract`型を組み合わせると、複雑な型から必要な部分だけを抽出できます。これにより、型の設計が効率的になります。
type Status = "success" | "error" | "pending";
type AllowedStatus = "success" | "error";
type ValidStatus = Extract<Status, AllowedStatus>;
// ValidStatusは"success" | "error"になりますExtract型とリテラル型の応用
`Extract`型は、リテラル型を操作する際に特に有用です。特定のリテラル値だけを型として取り出すことができます。
type Letters = "a" | "b" | "c" | "d";
type Vowels = "a" | "e" | "i" | "o" | "u";
type CommonLetters = Extract<Letters, Vowels>;
// CommonLettersは"a"になりますExtract型と条件付き型
`Extract`型は条件付き型と組み合わせることで、動的に型を操作することが可能です。これにより、柔軟な型定義が実現します。
type IsString<T> = T extends string ? T : never;
type ExtractedString = Extract<"a" | 1 | "b" | 2, string>;
// ExtractedStringは"a" | "b"になりますExtract型とジェネリクス
ジェネリクスと`Extract`型を組み合わせることで、より汎用的な型抽出が可能になります。これにより、コードの再利用性が向上します。
function extractValues<T, U>(values: T[], filter: U): Extract<T, U>[] {
return values.filter(value => value === filter) as Extract<T, U>[];
}
const items = ["a", "b", "c"] as const;
const result = extractValues(items, "a");
// resultは["a"]になりますExtract型と型の安全性
`Extract`型を使用することで、型の安全性を高めることができます。これにより、不適切な型の使用を防ぎ、エラーを未然に防ぐことが可能です。
type Role = "admin" | "user" | "guest";
type PrivilegedRole = "admin" | "user";
type AccessibleRoles = Extract<Role, PrivilegedRole>;
// AccessibleRolesは"admin" | "user"になりますExtract型と型のフィルタリング
`Extract`型は、特定の条件に一致する型だけを抽出するフィルタリング機能としても利用できます。
type Numbers = 1 | 2 | 3 | 4 | 5;
type EvenNumbers = Extract<Numbers, 2 | 4>;
// EvenNumbersは2 | 4になりますExtract型とtypeof演算子
`typeof`演算子を`Extract`型と併用することで、変数の型を動的に取得して操作することが可能になります。
const example = { name: "Alice", age: 30 };
type ExampleType = typeof example;
type StringProperties = Extract<keyof ExampleType, "name" | "address">;
// StringPropertiesは"name"になりますExtract型とAPIレスポンス
APIレスポンス型から必要なデータだけを抽出する際に、`Extract`型は非常に便利です。以下の例では、APIレスポンスから特定のキーを抽出しています。
type ApiResponse = { id: number; name: string; email: string };
type PublicResponse = Extract<keyof ApiResponse, "id" | "name">;
// PublicResponseは"id" | "name"になりますExtract型とコンポーネントの型制約
Reactコンポーネントなどの型制約においても、`Extract`型は有用です。特定のプロパティだけを抽出して型として使用することで、型の設計が簡素化されます。
type Props = { id: number; name: string; onClick: () => void };
type EventHandlers = Extract<keyof Props, "onClick">;
// EventHandlersは"onClick"になりますまとめ
TypeScriptの`Extract`型を使用することで、型の共通部分を簡単に抽出し、柔軟で安全な型定義が可能になります。ユニオン型やリテラル型、ジェネリクス、条件付き型との組み合わせにより、多様なユースケースに対応できます。適切に活用することで、より効率的なコードを実現できます。
-
前の記事
draw.io ズームイン・ズームアウトを行うショートカットキー 2024.12.13
-
次の記事
Rubyの例外処理をマスターする:エラーを安全に扱うための設計 2024.12.16
コメントを書く