В описании типа все поля необязательные, но хотябы из них должно быть обязательно

например

 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] индексированный доступ к объединению типов, полученному после итерации

→ Ссылка