tRPC para TypeScript: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es tRPC y para qué sirve?

\n\n

tRPC (TypeScript Remote Procedure Call) es una biblioteca moderna para crear APIs con seguridad de tipos (type-safe) entre el cliente y el servidor. La característica principal de tRPC es que no requiere generación de código ni duplicación de tipos. Simplemente escribes funciones en el servidor y el cliente accede a ellas con soporte completo de TypeScript: autocompletado, verificación de tipos e IntelliSense.

\n\n

A diferencia de REST o GraphQL, donde necesitas describir manualmente esquemas, endpoints y tipos, tRPC infiere automáticamente los tipos a partir de tu código del servidor. Esto simplifica radicalmente el desarrollo y reduce la cantidad de errores.

\n\n

Principales ventajas de tRPC:

\n
    \n
  • Seguridad total de tipos — los errores de tipo se detectan en tiempo de compilación, no en tiempo de ejecución
  • \n
  • Sin generación de código — no es necesario ejecutar generadores ni sincronizar esquemas
  • \n
  • Mínimo boilerplate — menos código que en REST o GraphQL
  • \n
  • Documentación automática — los tipos sirven como documentación
  • \n
  • Simplicidad — funciona como una llamada a función normal
  • \n
\n\n

tRPC es ideal para aplicaciones full-stack en TypeScript (Next.js, Remix, Express, Fastify) y para arquitectura de microservicios.

\n\n

Instalación de tRPC

\n\n

tRPC consta de varios paquetes. Para el uso básico necesitarás:

\n\n
# Instalación de las partes del servidor y del cliente\nnpm install @trpc/server @trpc/client\n\n# Instalación del adaptador para React (si usas React)\nnpm install @trpc/react-query @tanstack/react-query\n\n# Instalación del adaptador para Next.js\nnpm install @trpc/next @trpc/react-query @tanstack/react-query\n\n# Instalación de Zod para validación (recomendado)\nnpm install zod
\n\n

Si usas yarn o pnpm:

\n\n
yarn add @trpc/server @trpc/client\npnpm add @trpc/server @trpc/client
\n\n

Para desarrolladores de Python (si usas Python en el backend): tRPC es una biblioteca de TypeScript, pero puedes usarla con Python a través de trpc-py (envoltorio experimental). Sin embargo, el ecosistema principal es TypeScript.

\n\n

Inicio rápido con ejemplo de código

\n\n

Vamos a crear una aplicación simple: un servidor con procedimientos para trabajar con usuarios y un cliente que los llama.

\n\n

1. Servidor (server.ts)

\n\n
import { initTRPC } from '@trpc/server';\nimport { z } from 'zod';\n\n// Creamos una instancia de tRPC\nconst t = initTRPC.create();\n\n// Definimos el tipo de usuario\ninterface User {\n  id: number;\n  name: string;\n  email: string;\n}\n\n// Base de datos falsa\nconst users: User[] = [\n  { id: 1, name: 'Alice', email: 'alice@example.com' },\n  { id: 2, name: 'Bob', email: 'bob@example.com' },\n];\n\n// Creamos el router con procedimientos\nconst appRouter = t.router({\n  // Procedimiento para obtener todos los usuarios\n  getUsers: t.procedure\n    .query(() => {\n      return users;\n    }),\n\n  // Procedimiento para obtener un usuario por ID\n  getUserById: t.procedure\n    .input(z.number())\n    .query(({ input }) => {\n      return users.find(user => user.id === input) || null;\n    }),\n\n  // Procedimiento para crear un usuario\n  createUser: t.procedure\n    .input(z.object({\n      name: z.string().min(1),\n      email: z.string().email(),\n    }))\n    .mutation(({ input }) => {\n      const newUser: User = {\n        id: users.length + 1,\n        name: input.name,\n        email: input.email,\n      };\n      users.push(newUser);\n      return newUser;\n    }),\n});\n\n// Exportamos el tipo del router para el cliente\nexport type AppRouter = typeof appRouter;
\n\n

2. Cliente (client.ts)

\n\n
import { createTRPCClient, httpBatchLink } from '@trpc/client';\nimport type { AppRouter } from './server';\n\n// Creamos el cliente\nconst client                    

Recommendations