Required<T>
Required<T>は、Tのすべてのプロパティからオプショナルであることを意味する?を取り除くユーティリティ型です。
Required<T>の型引数
T
型引数Tにはオブジェクトの型を表す型を代入します。
Requiredの使用例
tstypePerson = {surname : string;middleName ?: string;givenName : string;};typeRequiredPerson =Required <Person >;
tstypePerson = {surname : string;middleName ?: string;givenName : string;};typeRequiredPerson =Required <Person >;
上のRequiredPersonは次と同じ型になります。
tstypeRequiredPerson = {surname : string;middleName : string;givenName : string;};
tstypeRequiredPerson = {surname : string;middleName : string;givenName : string;};
Requiredの実装
Required<T>は次のように実装されています。
tstypeRequired <T > = {[P in keyofT ]-?:T [P ];};
tstypeRequired <T > = {[P in keyofT ]-?:T [P ];};
Partial<T>と参照してみると違いがわかります。
tstypePartial <T > = {[P in keyofT ]?:T [P ];};
tstypePartial <T > = {[P in keyofT ]?:T [P ];};
異なる部分は-?と?の部分です。?はオプション修飾子で、プロパティがオプショナルになります。-?はオプション修飾子を取り除くことを意味します。したがって、Required<T>は、Tのすべてのプロパティからオプショナルであることを意味する?を取り除いた型を生成します。
このときの-をmapping modifierと呼びます。
関連情報
📄️ Partial<T>
全プロパティをオプショナルにする
📄️ Mapped Types
インデックス型では設定時はどのようなキーも自由に設定できてしまい、アクセス時は毎回undefinedかどうかの型チェックが必要です。入力の形式が決まっているのであればMapped Typesの使用を検討できます。