ある型を持つオブジェクトを生成する関数を定義する際に、そのオブジェクトの型を引数の型として利用したい。ただし、一部の引数は必須で、残りは任意としたいような場合にどのように引数の型を定義するといいか調べた。
interface Option {
flagA: boolean;
flagB: boolean;
flagC: boolean;
};
type RequiredOptionItem = "flagA" | "flagB";
/**
* これと同じ
* interface RequiredOption {
* flagA: boolean;
* flagB: boolean;
* };
*/
type RequiredOption = Pick<Option, RequiredOptionItem>;
/**
* これと同じ
* interface OptionalOption {
* flagC?: boolean;
* };
*/
type OptionalOption = Partial<Omit<Option, RequiredOptionItem>>;
/**
* argsはこの型と同じ
* interface Args {
* flagA: boolean;
* flagB: boolean;
* flagC?: boolean;
* };
*/
function createOption(args: RequiredOption & OptionalOption) {
return {
flagA: args.flagA,
flagB: args.flagB,
flagC: args.flagC || false,
} satisfies Option;
};
Pick<T, Keys>
は、型T
のうちKeys
で指定したプロパティのみを持つ部分型を表す。なので、Pick<Option, RequiredOptionItem>
でflagA
とflagB
のみを持つ型を表している。Omit<T, Keys>
はPick
の逆で、型T
からKeys
で指定したプロパティを除いた部分型を表す。Partial<T>
は型T
のプロパティすべてを任意にした型を表す。なので、Partial<Omit<Option, RequiredOptionItem>>
はRequiredOptionItem
で指定したプロパティを除いたプロパティだけを持ち、かつそれらが任意になっている型を表す。- 引数の型には
&
で交差型にすることで、一部のプロパティが必須、残りが任意となる型を指定できる。