Partial<T>
Partial<T>
は、オブジェクト型T
のすべてのプロパティをオプションプロパティにするユーティリティ型です。
Partial<T>の型引数
T
型引数T
にはオブジェクト型を渡します。
Partialの使用例
ts
typePerson = {surname : string;middleName ?: string;givenName : string;};typePartialPerson =Partial <Person >;
ts
typePerson = {surname : string;middleName ?: string;givenName : string;};typePartialPerson =Partial <Person >;
このPartialPerson
は次の型と同じになります。
ts
typePartialPerson = {surname ?: string;middleName ?: string;givenName ?: string;};
ts
typePartialPerson = {surname ?: string;middleName ?: string;givenName ?: string;};
Partialを用いたOptions Objectパターンの例
Partial
をOptions Objectパターンに応用すると、省略可能でありながら見やすい関数を実装できます。
📄️ キーワード引数とOptions Objectパターン
ユーザーの検索をかける関数を作ります。プロパティはそれぞれ引数となっており、対応する引数に値を与えると検索ができる関数findUsers()
があるとします。ここでは例のため引数をすべてオプション引数にします。
ts
typeUser = {surname : string;middleName ?: string;givenName : string;age : number;address ?: string;nationality : string;createdAt : string;updatedAt : string;};functionfindUsers (surname ?: string,middleName ?: string,givenName ?: string,age ?: number,address ?: string,nationality ?: string) {// ...}
ts
typeUser = {surname : string;middleName ?: string;givenName : string;age : number;address ?: string;nationality : string;createdAt : string;updatedAt : string;};functionfindUsers (surname ?: string,middleName ?: string,givenName ?: string,age ?: number,address ?: string,nationality ?: string) {// ...}
このfindUsers()
のシグネチャだと年齢だけがXX才のユーザーが欲しい時は引数の順番を維持するために他の引数はundefined
を入力しなければいけません。
ts
findUsers (undefined ,undefined ,undefined , 22);
ts
findUsers (undefined ,undefined ,undefined , 22);
この例では引数は6個しかなくage
以降の引数は省略できるためそこまで見辛くありませんが、多い引数の関数になるとどこが対応する引数なのかを探すだけでも面倒です。これをPartial<T>
を使って見た目をよくできます。
まず引数はすべてオブジェクトで受け渡しされるものとしてそのオブジェクトの型を定義します。さらにプロパティを省略可能にするためにPartial<T>
をつけます。
ts
typeFindUsersArgs =Partial <User >;
ts
typeFindUsersArgs =Partial <User >;
これを関数findUsers()
の引数にします。
ts
functionfindUsers ({surname ,middleName ,givenName ,age ,address ,nationality ,}:FindUsersArgs ) {// ...}
ts
functionfindUsers ({surname ,middleName ,givenName ,age ,address ,nationality ,}:FindUsersArgs ) {// ...}
これだけではまだ呼び出し側は省略ができません。findUsers()
を使用する時は仮に何も設定する必要がなくても引数に{}
を与えなければいけません。
ts
findUsers ({});
ts
findUsers ({});
引数を省略できるようにするためにデフォルト引数を使い省略時に{}
が代入されるようにします。
ts
functionfindUsers ({surname ,middleName ,givenName ,age ,address ,nationality ,}:FindUsersArgs = {}) {// ...}findUsers ();findUsers ({age : 22 });
ts
functionfindUsers ({surname ,middleName ,givenName ,age ,address ,nationality ,}:FindUsersArgs = {}) {// ...}findUsers ();findUsers ({age : 22 });
FindUsersArgs
の右の= {}
がそれにあたります。これによりfindUsers()
は引数がなくても呼び出せるようになります。特定の引数だけ値を指定することもできます。findUsers({ age: 22 })
がその例です。
さらにFindUsersArgs
側にもデフォルト型を設定することで初期値を代入することもできます。
ts
functionfindUsers ({surname = "Doe",givenName = "John",nationality = "Araska",age = 22,}:FindUsersArgs = {}) {// ...}
ts
functionfindUsers ({surname = "Doe",givenName = "John",nationality = "Araska",age = 22,}:FindUsersArgs = {}) {// ...}