RequireAtLeastOne type

RequireAtLeastOne は、インターフェイスの少なくとも 1 つのプロパティ (任意のプロパティを指定できます) が存在する必要がある型を作成するのに役立ちます。

これは、TypeScript のユーティリティの種類が原因で機能します。 https://www.typescriptlang.org/docs/handbook/utility-types.html 次のように調べてみましょう。

  • [K in keyof T]-? このプロパティ (K) は、T のプロパティと同じ名前を持つ場合にのみ有効です。
  • Required<Pick<T, K>> は、イテレーション内の現在のプロパティだけを持つ T から新しい型を作成し、それを必須としてマークします
  • Partial<Pick<T, Exclude<keyof T, K>>> は、プロパティ K を除き、T のすべてのプロパティを持つ新しい型を作成します。
  • & は、 から必要なプロパティを 1 つだけ持つ型と、 Required<...>Partial<...>からのすべての省略可能なプロパティを統合します。
  • [keyof T] では、T のプロパティのみが許可されます。
type RequireAtLeastOne<T> = {
  [K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>
}[keyof T]