Какие инструменты для автоматической генерации типов с backend существуют
Что проверяют
Понимаете ли вы, откуда фронтенд берёт типы ответов и что происходит, когда бэкенд их меняет. Следом обычно спрашивают, где запускается генерация, коммитится ли результат и защищают ли типы от неверных данных в рантайме.
Как отвечать
Инструмент определяется тем, какой контракт отдаёт бэкенд:
- OpenAPI (REST):
openapi-typescriptделает только типы, а в паре сopenapi-fetchполучается типизированный клиент без лишнего кода.orvalи@hey-api/openapi-tsгенерируют готовые функции запросов, хуки для TanStack Query, схемы Zod и моки для MSW; - GraphQL: GraphQL Code Generator строит типы по схеме и по конкретным запросам из
documents, поэтому тип ответа совпадает с тем, что вы реально запросили. Вариант без шага генерации:gql.tada, где типы выводит сам TypeScript; - gRPC и Protobuf:
ts-protoилиprotoc-gen-es, в браузере поверх Connect или gRPC-Web; - общий TypeScript: если бэкенд тоже на TypeScript и лежит в монорепозитории, tRPC или общий пакет с типами избавляют от генерации совсем.
Затем назовите главное ограничение: типы TypeScript исчезают после компиляции и в рантайме ничего не проверяют. Если бэкенду нельзя доверять полностью, ответ валидируют схемой (Zod, Valibot), а тип выводят из неё через z.infer. Генерацию запускают скриптом в package.json и в CI, а расхождение свежего файла с закоммиченным роняет сборку. Так изменение контракта становится ошибкой компиляции, а не сюрпризом на проде.
Где спотыкаются
Называют Swagger генератором типов. OpenAPI (бывший Swagger) это формат описания API, типы из него делают отдельные инструменты.
Считают, что сгенерированные типы гарантируют корректность данных. Если спецификация устарела, TypeScript спокойно пропустит null там, где обещана строка.
Забывают про особенности маппинга: даты приходят строками даже при format: date-time, nullable и необязательное поле это разные вещи, а перечисления становятся объединением строк или enum в зависимости от настроек генератора.