ユーティリティ型は、既存の型に基づいて型を変換、修正、または派生型を取得するためのTypeScriptの組み込みツールです。最も一般的なものは次の通りです:
Partial<T> — 型Tのすべてのプロパティを任意にしますRequired<T> — 型Tのすべてのプロパティを必須にしますPick<T, K> — 型TからプロパティKのみを選択しますOmit<T, K> — 型TからプロパティKを除外しますtype User = { id: number; name: string; age?: number }; type UserPreview = Pick<User, 'id' | 'name'>; type UserPatch = Partial<User>; type FullUser = Required<User>; type UserWithoutAge = Omit<User, 'age'>;
これにより、より柔軟なAPIやDTOを作成できます。
型がオプショナルとして指定されている場合(
age?: number)、Required<T>はどのように動作しますか?それはオプショナルのままですか?
回答: いいえ、Required<T>は型Tのすべてのプロパティを必須に変換します(オプショナルなものも含む)。
type User = { age?: number }; type UserRequired = Required<User>; // UserRequired: { age: number }
物語
データベースに安全であると考え、オブジェクトの更新にPartial<T>を使用しました。null/undefinedのフィールドをチェックするのを忘れ、エンティティの更新時にバリデーションエラーが発生しました。
物語
リクエストタイプから技術的なプロパティを除外するためにOmit<T, K>を使用しましたが、モデルのリファクタリング時に新しい技術的なフィールドが除外リストに追加されていないことに気づきませんでした。結果として、プライベートフィールドがAPIを介して漏れてしまいました。
物語
Sharedライブラリにおいて、Pick<T, K>型を作成し、キーのリストを間違えました:Kは元の型に部分的に存在しませんでした。TypeScriptはリテラル文字列を使用する際のエラーを見逃しましたが、元の型が変更されると不一致が発生し、すべてのサービスで一部の型が「壊れ」ました。