ts-rest
RPC-like client, contract, and server implementation for a pure REST API
README
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
- ```typescript
- 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
- },
- },
- });
- ```
Fulfil the contract on your sever, with a type-safe router:
- ```typescript
- 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:
- ```typescript
- const result = await client.getPosts({
- query: { skip: 0, take: 10 },
- // ^-- Fully typed!
- });
- ```
Quickstart
Install the core package
- ```bash
- 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 📖 |
This project follows the all-contributors specification. Contributions of any kind welcome!
<a
href="https://vercel.com/?utm_source=ts-rest&utm_campaign=oss"
target="_blank"
rel="noreferrer"
>
<img
src="https://ts-rest.com/img/powered-by-vercel.svg"
alt="Powered by Vercel"
height="40"
/>