Programmingフルスタック開発者

TypeScriptにおける「ユーティリティ型」(例えば、Partial、Required、Pick、Omit)とは何ですか?どこでどのように適用し、使用時にしばしば犯す誤りは何ですか?

Hintsage AIアシスタントで面接を突破

回答

ユーティリティ型は、既存の型に基づいて型を変換、修正、または派生型を取得するための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はリテラル文字列を使用する際のエラーを見逃しましたが、元の型が変更されると不一致が発生し、すべてのサービスで一部の型が「壊れ」ました。