Типизация объектов в Typescript: гарантия единственного обязательного поля

Для API-запросов, требующих передачи одного из нескольких параметров (например, chatId, groupId или userId), необходимо строгое ограничение на выбор только одного обязательного поля. Стандартные опциональные типы type GetUnreadMessages = { groupId?: string; chatId?: string; userId?: string; } не обеспечивают такого контроля, допуская наличие нескольких или ни одного параметра.
Типизация объектов в Typescript: гарантия единственного обязательного поля
Изображение носит иллюстративный характер

Для решения этой задачи в Typescript можно использовать утилитарный тип Record, который позволяет создавать тип с определенными ключами и значениями. Объединяя его с Partial и исключениями undefined, можно получить тип, где только один из заданных ключей является обязательным, а остальные – undefined.

Ключевым элементом является обертка RequireOnlyOne, которая перебирает все ключи исходного типа, делая каждый из них поочередно обязательным с помощью RequireOneKey. Union результатов дает возможность иметь только один обязательный ключ. Применение -? устраняет опциональность полей при переборе.

Данный подход позволяет автоматически трансформировать сгенерированные типы (например, из Swagger) для конкретных нужд, избегая ручного создания подобных структур. Это также позволяет уверенно использовать код, благодаря понятной структуре и тестам, гарантирующим корректность его работы.


Новое на сайте

19753ИИ обгоняет людей в биомедицинском анализе — так ли это опасно, как звучит? 19752Artemis II летит к луне: что происходит и как за этим следить 19751Лекарство от диабета первого типа: шутка про «пять лет» перестаёт быть шуткой 19750Псевдонаука на службе рабства: как учёные XIX века торговали теориями о смешанной крови 19749Как SOC-команды теряют время на многоплатформенных атаках и как это остановить 19748Как люди научились жить там, где жить невозможно? 19747Рабочий ноутбук разработчика стал главной целью хакеров 19746Может ли песок решить главную проблему возобновляемой энергетики? 19745Как группировки Qilin и Warlock обезоруживают антивирусы через уязвимые драйверы 19744Самые прожорливые чёрные дыры во вселенной остаются без еды 19743Artemis: момент, который определит целое поколение 19742Почему в горах реже болеют диабетом? 19741Что скрывается подо льдами Антарктиды и почему страны могут начать за это бороться? 19740ДНК моркови и красного коралла на туринской плащанице 19739Что нового нашёл телескоп NASA в остатках сверхновой, которую китайские астрономы...
Ссылка