RequireAtLeastOne type
RequireAtLeastOne помогает создать тип, в котором требуется по крайней мере одно из свойств интерфейса (может быть любым свойством).
Это работает из-за типов служебных программ 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>>>
создает новый тип со всеми свойствами T, за исключением свойства K.&
— это то, что объединяет тип только с одним обязательным свойством из со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]