メインコンテンツまでスキップ

Required<T>

Required<T>は、Tのすべてのプロパティからオプショナルであることを意味する?を取り除くユーティリティ型です。

Required<T>の型引数

T

型引数Tにはオブジェクトの型を表す型を代入します。

Requiredの使用例

ts
type Person = {
surname: string;
middleName?: string;
givenName: string;
};
type RequiredPerson = Required<Person>;
type RequiredPerson = { surname: string; middleName: string; givenName: string; }
ts
type Person = {
surname: string;
middleName?: string;
givenName: string;
};
type RequiredPerson = Required<Person>;
type RequiredPerson = { surname: string; middleName: string; givenName: string; }

上のRequiredPersonは次と同じ型になります。

ts
type RequiredPerson = {
surname: string;
middleName: string;
givenName: string;
};
ts
type RequiredPerson = {
surname: string;
middleName: string;
givenName: string;
};

Requiredの実装

Required<T>は次のように実装されています。

ts
type Required<T> = {
[P in keyof T]-?: T[P];
};
ts
type Required<T> = {
[P in keyof T]-?: T[P];
};

Partial<T>と参照してみると違いがわかります。

ts
type Partial<T> = {
[P in keyof T]?: T[P];
};
ts
type Partial<T> = {
[P in keyof T]?: T[P];
};

異なる部分は-??の部分です。?はオプション修飾子で、プロパティがオプショナルになります。-?はオプション修飾子を取り除くことを意味します。したがって、Required<T>は、Tのすべてのプロパティからオプショナルであることを意味する?を取り除いた型を生成します。
このときの-をmapping modifierと呼びます。

関連情報

📄️ Partial<T>

全プロパティをオプショナルにする

📄️ Mapped Types

インデックス型では設定時はどのようなキーも自由に設定できてしまい、アクセス時は毎回undefinedかどうかの型チェックが必要です。入力の形式が決まっているのであればMapped Typesの使用を検討できます。