Якщо API описано специфікацією OpenAPI, клієнтський код не треба писати й підтримувати вручну: типи запитів і відповідей генеруються з контракту.
Варіант 1 - лише типи (openapi-typescript + openapi-fetch):
npx openapi-typescript ./openapi.json -o ./src/api/schema.d.ts
import createClient from 'openapi-fetch';
import type { paths } from './api/schema';
const api = createClient<paths>({ baseUrl: '/api' });
const { data, error } = await api.GET('/vacancies/{id}', {
params: { path: { id: 42 } },
});
// data - точний тип відповіді 200, error - тип помилки з опису
Шлях, параметри й тип відповіді перевіряються компілятором: друкарська помилка в URL чи відсутній обов'язковий параметр - помилка TypeScript, а не 404 у продакшені.
Варіант 2 - повний SDK (OpenAPI Generator, Hey API, Orval, Kiota): згенеровані класи чи функції для кожної операції, моделі, інколи - готові хуки для TanStack Query.
Процес, що працює:
- специфікація - артефакт бекенду (Scramble
scramble:exportчи написана вручну) у репозиторії чи CI; - генерація клієнта - крок збирання фронтенду або окремий пакет;
- зміна API ламає збирання фронтенду, якщо клієнтський код не відповідає новому контракту, - помилка виявляється до деплою.
Що варто врахувати:
- якість згенерованого залежить від якості специфікації:
type: objectбез властивостей дастьRecord<string, unknown>, неописані помилки - відсутність типів для них. Генерація клієнтів швидко показує прогалини в документації; nullableі необов'язкові поля - розрізняти «поле може бутиnull» і «поля може не бути» (required). Неточність тут - джерело помилокundefinedна клієнті;- типи не перевіряють дані під час виконання. Відповідь сервера, що не відповідає контракту, тихо пройде. Для критичних даних - валідація схемою (Zod, згенерований зі специфікації);
- не редагувати згенерований код вручну - зміни зникнуть при наступній генерації. Розширення - обгортками;
- версії інструментів: не всі генератори повністю підтримують OpenAPI 3.1 (типи-масиви
[string, 'null'],$refпоряд з іншими полями).
Альтернатива в межах Laravel + Inertia: Wayfinder генерує типізовані функції для маршрутів і дій контролерів без проміжної специфікації.