ts-rest
RPC-like client and server helpers for a magical end to end typed experience
Introduction
ts-rest offers a simple way to define a contract for your API, which can be both consumed and implemented by your application, giving you end to end type safety without the hassle or code generation.
Features
- End to end type safety 🛟
- RPC-like client side interface
📡 -
Tiny bundle size
🌟 (1kb!) - Well-tested and production ready
✅ - No Code Generation
🏃♀️ - Zod support for runtime type checks
👮♀️ - Full optional OpenAPI integration
📝
Super Simple Example
Easily define your API contract somewhere shared
const contract = c.contract({
getPosts: {
method: 'GET',
path: '/posts',
query: z.object({
skip: z.number(),
take: z.number(),
}), // <-- Zod schema
responses: {
200: c.response<Post[]>(), // <-- OR normal TS types
},
headers: z.object({
'x-pagination-page': z.coerce.number().optional(),
}),
},
});
Fulfil the contract on your sever, with a type-safe router:
const router = s.router(contract, {
getPost: async ({ params: { id } }) => {
return {
status: 200,
body: prisma.post.findUnique({ where: { id } }),
};
},
});
Consume the api on the client with a RPC-like interface:
const result = await client.getPosts({
headers: { 'x-pagination-page': 1 },
query: { skip: 0, take: 10 },
// ^-- Fully typed!
});
Quickstart
Install the core package
yarn add @ts-rest/core
# Optional react-query integration
yarn add @ts-rest/react-query
# Pick your backend
yarn add @ts-rest/nest @ts-rest/express
# For automatic server OpenAPI gen
yarn add @ts-rest/open-api
Create a contract, implement it on your server then consume it in your client. Incrementally adopt, trial it with your team, then get shipping faster.
👉 Read more on the official Quickstart Guide 👈
Star History
✨
Contributors Thanks goes to these wonderful people (emoji key):
Youssef Gaber |
Per Hermansson |
Grégory Houllier |
Michael Angelo |
Pieter Venter |
Rifaldhi AW |
Jonathan White |
Max Brosnahan |
Oliver Butler |
Adrian Barylski |
This project follows the all-contributors specification. Contributions of any kind welcome!