Типобезпечний бекенд із tRPC: розробка API для React, Next.js і Vue
Синхронізація типів між фронтом і беком — головний біль будь-якого TypeScript-проекту. За досвідом роботи з десятками проектів, ця проблема входить до трійки найчастіших причин багів у продакшні. REST вимагає копіювання типів або OpenAPI-генерації, GraphQL — схем і кодогенерації. Ми використовуємо tRPC, який вирішує цю проблему радикально: типи проходять крізь стек автоматично. Жодних ручних interface на клієнті, жодних генераторів — просто функції з повною типізацією.
Уявіть ситуацію: бекендер змінює модель User, забуває повідомити фронтенд — на клієнті помилка компіляції в рантаймі. З tRPC таке неможливо: типи синхронізуються автоматично, і помилка проявляється на етапі розробки. Це скорочує кількість багів на 60% і прискорює випуск релізів у 2 рази.
tRPC — бібліотека для побудови end-to-end типізованих API без схем і кодогенерації. Типи TypeScript автоматично переходять від серверних процедур до клієнтських викликів. Працює лише в екосистемі TypeScript і найбільш зручна в monorepo або fullstack-фреймворках (Next.js, Remix, SvelteKit).
Які проблеми вирішує tRPC?
-
Розсинхронізація типів — більше не потрібно дублювати інтерфейси на фронті та беку. Зміна схеми БД автоматично оновлює типи на клієнті. Підписки (subscription) також реалізуються просто — через
t.procedure.subscription. - Кодогенерація — tRPC не вимагає генерації клієнтів або схем. Усе будується на TypeScript-compiler.
- Локшина з ендпоінтів — процедури групуються в роутери, кожен роутер відповідає за свою сутність.
- Відсутність автодоповнення — клієнт отримує повну типізацію з Intellisense.
Деталі валідації з Zod
Zod — бібліотека для декларативної валідації та парсингу схем TypeScript. У tRPC ми використовуємо її для перевірки вхідних даних: типи виводяться автоматично, а помилки форматуються у зрозумілому вигляді. Наприклад, перевірка обов'язкових полів, мінімальної довжини рядка або діапазону чисел.Як ми налаштовуємо tRPC?
Ми використовуємо tRPC v11 з валідацією Zod та React Query на клієнті. Налаштування сервера:
// server/trpc.ts
import { initTRPC, TRPCError } from '@trpc/server';
import { ZodError } from 'zod';
const t = initTRPC.context<Context>().create({
errorFormatter({ shape, error }) {
return {
...shape,
data: {
...shape.data,
zodError: error.cause instanceof ZodError ? error.cause.flatten() : null,
},
};
},
});
export const router = t.router;
export const publicProcedure = t.procedure;
export const protectedProcedure = t.procedure.use(({ ctx, next }) => {
if (!ctx.session?.user) throw new TRPCError({ code: 'UNAUTHORIZED' });
return next({
ctx: {
...ctx,
user: ctx.session.user,
},
});
});
Роутер і процедури:
// server/routers/articles.ts
export const articlesRouter = router({
list: publicProcedure
.input(z.object({
page: z.number().default(1),
limit: z.number().max(100).default(20)
}))
.query(async ({ input, ctx }) => {
const [items, total] = await ctx.db.$transaction([
ctx.db.article.findMany({
skip: (input.page - 1) * input.limit,
take: input.limit
}),
ctx.db.article.count(),
]);
return { items, total, pages: Math.ceil(total / input.limit) };
}),
create: protectedProcedure
.input(z.object({
title: z.string().min(1).max(200),
body: z.string().min(10)
}))
.mutation(async ({ input, ctx }) =>
ctx.db.article.create({
data: { ...input, authorId: ctx.user.id }
})
),
delete: protectedProcedure
.input(z.string())
.mutation(async ({ input: id, ctx }) => {
const article = await ctx.db.article.findUnique({ where: { id } });
if (!article) throw new TRPCError({ code: 'NOT_FOUND' });
if (article.authorId !== ctx.user.id) throw new TRPCError({ code: 'FORBIDDEN' });
return ctx.db.article.delete({ where: { id } });
}),
});
Процес розробки tRPC-API
| Етап | Що робимо | Тривалість |
|---|---|---|
| Аналіз | Збираємо вимоги, проектуємо роутери та типи, оцінюємо кількість процедур (в середньому 10–20 на проект) | 1–2 дні |
| Налаштування | Підключаємо tRPC, контекст, middleware, валідацію Zod | 1 день |
| Реалізація | Пишемо процедури, підписки, інтеграцію з базою даних (PostgreSQL, MySQL) | 3–5 днів |
| Інтеграція | Налаштовуємо React Query на клієнті, кешування, оптимістичні оновлення | 1–2 дні |
| Тестування | Покриваємо процедури unit-тестами (jest), end-to-end тести | 1–2 дні |
| Деплой | Розгортаємо на Vercel або Docker-контейнері | 1 день |
Чому tRPC швидше за REST?
Швидкість розробки з tRPC в середньому на 40% вища, ніж з REST. Переконайтеся самі:
- Не потрібно писати документацію — типи документують себе.
- Відсутній етап кодогенерації та збірки схем.
- Автоматична типізація виключає помилки при передачі даних.
- Вбудована валідація через Zod прискорює обробку вхідних даних.
Порівняння tRPC, REST та GraphQL
| Характеристика | tRPC | REST | GraphQL |
|---|---|---|---|
| Типобезпечність | Автоматична | Ручна | Через схеми |
| Кодогенерація | Не потрібна | Часто потрібна | Обов'язкова |
| Автодоповнення | Так (Intellisense) | Ні | Частково |
| Overhead | Нульовий | Низький | Середній |
| Публічний API | Ні | Так | Так |
Що входить у роботу
- Розробка роутерів і процедур tRPC (CRUD, підписки, middleware) з використанням Zod для валідації.
- Інтеграція з React Query — налаштування кешування, інвалідації та оптимістичних оновлень.
- Реалізація аутентифікації та авторизації (JWT, сесії) через middleware.
- Написання тестів для процедур (jest, supertest) з покриттям не менше 80%.
- Розгортання на обраному хостингу (Vercel, Docker, виділений сервер) з CI/CD.
- Передача репозиторію з історією комітів та документація по API у форматі Markdown.
Терміни та вартість
Типовий tRPC API з аутентифікацією, CRUD-процедурами та валідацією — 1–2 тижні розробки. Вартість розраховується індивідуально і залежить від складності. Отримайте консультацію — ми оцінимо ваш проект.
Гарантії та досвід
Наша командамає 5+ років досвіду в TypeScript і розробила понад 50 fullstack-проектів на tRPC. Ми гарантуємо 100% типобезпечність на всіх рівнях, повне покриття коду тестами, передачу прав на код та документацію, а також підтримку після здачі проекту.
Зв'яжіться з нами для оцінки вашого проекту — ми проаналізуємо архітектуру та запропонуємо оптимальне рішення. Замовте розробку tRPC API вже сьогодні і переконайтеся в ефективності end-to-end типізації.







