Aller au contenu principal
Version : 11.x

Démarrage rapide

Traduction Bêta Non Officielle

Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →

Installation

tRPC est réparti entre plusieurs packages, vous pouvez donc n'installer que ce dont vous avez besoin. Assurez-vous d'installer les packages souhaités dans les sections appropriées de votre base de code. Pour ce guide de démarrage rapide, nous resterons simples et n'utiliserons que le client vanilla. Pour les guides spécifiques aux frameworks, consultez utilisation avec React et utilisation avec Next.js.

Exigences
  • tRPC nécessite TypeScript >=5.7.2
  • Nous recommandons fortement d'utiliser "strict": true dans votre tsconfig.json car nous ne prenons pas officiellement en charge le mode non strict.

Commencez par installer les packages @trpc/server et @trpc/client :

npm install @trpc/server @trpc/client
Agents IA

Si vous utilisez un agent de codage IA, installez les compétences tRPC pour une meilleure génération de code :

bash
npx @tanstack/intent@latest install
bash
npx @tanstack/intent@latest install

Votre première API tRPC

Parcourons les étapes de création d'une API typée avec tRPC. Pour commencer, cette API contiendra trois endpoints avec ces signatures TypeScript :

ts
type User = { id: string; name: string; };
userList: () => User[];
userById: (id: string) => User;
userCreate: (data: { name: string }) => User;
ts
type User = { id: string; name: string; };
userList: () => User[];
userById: (id: string) => User;
userCreate: (data: { name: string }) => User;

Voici la structure de fichiers que nous allons construire. Nous vous recommandons de séparer l'initialisation de tRPC, la définition du routeur et la configuration du serveur dans des fichiers distincts pour éviter les dépendances cycliques :

.
├── server/
│ ├── trpc.ts # tRPC instantiation & setup
│ ├── appRouter.ts # Your API logic and type export
│ └── index.ts # HTTP server
└── client/
└── index.ts # tRPC client
.
├── server/
│ ├── trpc.ts # tRPC instantiation & setup
│ ├── appRouter.ts # Your API logic and type export
│ └── index.ts # HTTP server
└── client/
└── index.ts # tRPC client

1. Créer une instance de routeur

D'abord, initialisons le backend tRPC. Il est recommandé de le faire dans un fichier séparé et d'exporter des fonctions d'aide réutilisables plutôt que l'objet tRPC complet.

server/trpc.ts
ts
import { initTRPC } from '@trpc/server';
 
/**
* Initialization of tRPC backend
* Should be done only once per backend!
*/
const t = initTRPC.create();
 
/**
* Export reusable router and procedure helpers
* that can be used throughout the router
*/
export const router = t.router;
export const publicProcedure = t.procedure;
server/trpc.ts
ts
import { initTRPC } from '@trpc/server';
 
/**
* Initialization of tRPC backend
* Should be done only once per backend!
*/
const t = initTRPC.create();
 
/**
* Export reusable router and procedure helpers
* that can be used throughout the router
*/
export const router = t.router;
export const publicProcedure = t.procedure;

Ensuite, nous initialiserons notre instance de routeur principale, communément appelée appRouter, à laquelle nous ajouterons ultérieurement des procédures. Enfin, nous devons exporter le type du routeur que nous utiliserons plus tard côté client.

server/appRouter.ts
ts
import { router } from './trpc';
 
export const appRouter = router({
// ...
});
 
export type AppRouter = typeof appRouter;
server/appRouter.ts
ts
import { router } from './trpc';
 
export const appRouter = router({
// ...
});
 
export type AppRouter = typeof appRouter;

2. Ajouter une procédure de requête

Utilisez publicProcedure.query() pour ajouter une procédure de requête au routeur.

Ce qui suit crée une procédure de requête appelée userList qui renvoie une liste d'utilisateurs :

server/appRouter.ts
ts
import { publicProcedure, router } from './trpc';
 
export const appRouter = router({
userList: publicProcedure
.query(async () => {
const users: User[] = [{ id: '1', name: 'Katt' }];
 
return users;
}),
});
 
export type AppRouter = typeof appRouter;
server/appRouter.ts
ts
import { publicProcedure, router } from './trpc';
 
export const appRouter = router({
userList: publicProcedure
.query(async () => {
const users: User[] = [{ id: '1', name: 'Katt' }];
 
return users;
}),
});
 
export type AppRouter = typeof appRouter;

3. Utiliser un parseur d'entrée pour valider les inputs

Pour implémenter la procédure userById, nous devons accepter une entrée client. tRPC permet de définir des parseurs d'entrée pour valider et parser l'input. Vous pouvez définir votre propre parseur ou utiliser une bibliothèque de validation comme zod, yup ou superstruct.

Vous définissez votre parseur d'entrée dans publicProcedure.input(), accessible ensuite dans la fonction de résolution comme ci-dessous :

The input parser can be any ZodType, e.g. z.string() or z.object().


server/appRouter.ts
ts
import { publicProcedure, router } from './trpc';
import { z } from 'zod';
 
export const appRouter = router({
// ...
userById: publicProcedure
.input(z.string())
.query(async (opts) => {
const { input } = opts;
const input: string
const user: User = { id: input, name: 'Katt' };
 
return user;
}),
});
 
export type AppRouter = typeof appRouter;
server/appRouter.ts
ts
import { publicProcedure, router } from './trpc';
import { z } from 'zod';
 
export const appRouter = router({
// ...
userById: publicProcedure
.input(z.string())
.query(async (opts) => {
const { input } = opts;
const input: string
const user: User = { id: input, name: 'Katt' };
 
return user;
}),
});
 
export type AppRouter = typeof appRouter;

4. Ajouter une procédure de mutation

Comme GraphQL, tRPC établit une distinction entre les procédures Query et Mutation.

La distinction entre Query et Mutation est principalement sémantique. Les Query utilisent HTTP GET et sont destinées à des opérations de lecture, tandis que les Mutations utilisent HTTP POST et sont destinées à des opérations provoquant des effets de bord.

Ajoutons une mutation userCreate en la définissant comme nouvelle propriété de notre objet routeur :

server/appRouter.ts
ts
import { publicProcedure, router } from './trpc';
 
export const appRouter = router({
// ...
userCreate: publicProcedure
.input(z.object({ name: z.string() }))
.mutation(async (opts) => {
const { input } = opts;
const input: { name: string; }
// Create the user in your DB
const user: User = { id: '1', ...input };
 
return user;
}),
});
 
export type AppRouter = typeof appRouter;
server/appRouter.ts
ts
import { publicProcedure, router } from './trpc';
 
export const appRouter = router({
// ...
userCreate: publicProcedure
.input(z.object({ name: z.string() }))
.mutation(async (opts) => {
const { input } = opts;
const input: { name: string; }
// Create the user in your DB
const user: User = { id: '1', ...input };
 
return user;
}),
});
 
export type AppRouter = typeof appRouter;

Exposition de l'API

Maintenant que nous avons défini notre routeur, nous pouvons l'exposer. tRPC dispose d'adaptateurs de première classe pour de nombreux serveurs web populaires. Pour rester simple, nous utiliserons ici l'adaptateur Node.js standalone.

server/index.ts
ts
import { createHTTPServer } from '@trpc/server/adapters/standalone';
import { appRouter } from './appRouter';
 
const server = createHTTPServer({
router: appRouter,
});
 
server.listen(3000);
server/index.ts
ts
import { createHTTPServer } from '@trpc/server/adapters/standalone';
import { appRouter } from './appRouter';
 
const server = createHTTPServer({
router: appRouter,
});
 
server.listen(3000);
See the full backend code
server/trpc.ts
ts
import { initTRPC } from '@trpc/server';
 
const t = initTRPC.create();
 
export const router = t.router;
export const publicProcedure = t.procedure;
server/trpc.ts
ts
import { initTRPC } from '@trpc/server';
 
const t = initTRPC.create();
 
export const router = t.router;
export const publicProcedure = t.procedure;

server/appRouter.ts
ts
import { z } from "zod";
import { publicProcedure, router } from "./trpc";
 
type User = { id: string; name: string };
 
export const appRouter = router({
userList: publicProcedure
.query(async () => {
const users: User[] = [{ id: '1', name: 'Katt' }];
return users;
}),
userById: publicProcedure
.input(z.string())
.query(async (opts) => {
const { input } = opts;
const user: User = { id: input, name: 'Katt' };
return user;
}),
userCreate: publicProcedure
.input(z.object({ name: z.string() }))
.mutation(async (opts) => {
const { input } = opts;
const user: User = { id: '1', ...input };
return user;
}),
});
 
export type AppRouter = typeof appRouter;
server/appRouter.ts
ts
import { z } from "zod";
import { publicProcedure, router } from "./trpc";
 
type User = { id: string; name: string };
 
export const appRouter = router({
userList: publicProcedure
.query(async () => {
const users: User[] = [{ id: '1', name: 'Katt' }];
return users;
}),
userById: publicProcedure
.input(z.string())
.query(async (opts) => {
const { input } = opts;
const user: User = { id: input, name: 'Katt' };
return user;
}),
userCreate: publicProcedure
.input(z.object({ name: z.string() }))
.mutation(async (opts) => {
const { input } = opts;
const user: User = { id: '1', ...input };
return user;
}),
});
 
export type AppRouter = typeof appRouter;

server/index.ts
ts
import { createHTTPServer } from "@trpc/server/adapters/standalone";
import { appRouter } from "./appRouter";
 
const server = createHTTPServer({
router: appRouter,
});
 
server.listen(3000);
server/index.ts
ts
import { createHTTPServer } from "@trpc/server/adapters/standalone";
import { appRouter } from "./appRouter";
 
const server = createHTTPServer({
router: appRouter,
});
 
server.listen(3000);

Utiliser votre nouveau backend côté client

Passons maintenant au code côté client pour découvrir la puissance de la sécurité des types de bout en bout. Lorsque nous importons le type AppRouter pour l'utiliser côté client, nous obtenons une sécurité typage complète pour notre système sans divulguer aucun détail d'implémentation au client.

1. Configurer le client tRPC

client/index.ts
ts
import { createTRPCClient, httpBatchLink } from '@trpc/client';
import type { AppRouter } from './appRouter';
// 👆 **type-only** imports are stripped at build time
 
// Pass AppRouter as a type parameter. 👇 This lets `trpc` know
// what procedures are available on the server and their input/output types.
const trpc = createTRPCClient<AppRouter>({
links: [
httpBatchLink({
url: 'http://localhost:3000',
}),
],
});
client/index.ts
ts
import { createTRPCClient, httpBatchLink } from '@trpc/client';
import type { AppRouter } from './appRouter';
// 👆 **type-only** imports are stripped at build time
 
// Pass AppRouter as a type parameter. 👇 This lets `trpc` know
// what procedures are available on the server and their input/output types.
const trpc = createTRPCClient<AppRouter>({
links: [
httpBatchLink({
url: 'http://localhost:3000',
}),
],
});

Les liens dans tRPC sont similaires à ceux de GraphQL, ils nous permettent de contrôler le flux de données vers le serveur. Dans l'exemple ci-dessus, nous utilisons le httpBatchLink, qui regroupe automatiquement plusieurs appels en une seule requête HTTP. Pour une utilisation plus approfondie des liens, consultez la documentation sur les liens.

2. Inférence de types et autocomplétion

Vous avez maintenant accès à vos procédures API via l'objet trpc. Essayez !

client/index.ts
ts
// Inferred types
const user = await trpc.userById.query('1');
const user: User
 
const createdUser = await trpc.userCreate.mutate({ name: 'Katt' });
const createdUser: User
client/index.ts
ts
// Inferred types
const user = await trpc.userById.query('1');
const user: User
 
const createdUser = await trpc.userCreate.mutate({ name: 'Katt' });
const createdUser: User

Vous pouvez également utiliser votre autocomplétion pour explorer l'API côté client

client/index.ts
ts
trpc.u;
      
 
 
client/index.ts
ts
trpc.u;
      
 
 

Prochaines étapes

What's next?Description
Example AppsExplore tRPC in your chosen framework
TanStack React QueryRecommended React integration via @trpc/tanstack-react-query
Next.jsUsage with Next.js
Server AdaptersExpress, Fastify, and more
TransformersUse superjson to retain complex types like Date