В описании типа все поля необязательные, но хотябы из них должно быть обязательно
например
type PayloadData = {
phoneNumber?: string;
email?: string;
};
Как сделать так чтобы phoneNumber или email требовался обязательно, любой, хотябы один.
то есть валидными будут вот такие объекты { phoneNumber: '02' }, {email: '[email protected]'} и { phoneNumber: '02',email: '[email protected]' }
Ответы (1 шт):
Автор решения: UserTest013
→ Ссылка
type PayloadData = {
phoneNumber?: string;
email?: string;
};
type AtLeastOne<T> = {
[K in keyof T]: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>
}[keyof T]
// Example usage:
const data1: AtLeastOne<PayloadData> = {
phoneNumber: "1234567890",
};
const data2: AtLeastOne<PayloadData> = {
email: "[email protected]",
};
const data3: AtLeastOne<PayloadData> = {
phoneNumber: "1234567890",
email: "[email protected]",
};
const data4: AtLeastOne<PayloadData> = {}; // Error
{ [K in keyof T]-?: ... } итерирует по всем ключам K объекта T и выполняет действия внутри фигурных скобок
Required<Pick<T, K>> создает новый объект, в котором один ключ K делается обязательным. Pick<T, K>
Partial<Pick<T, Exclude<keyof T, K>>> создает новый объект, в котором все свойства из T (кроме K), делаются необязательными
[keyof T] индексированный доступ к объединению типов, полученному после итерации