- Home
- Services
- IVY
- Portfolio
- Blogs
- About Us
- Contact Us
- Sun-Tue (9:00 am-7.00 pm)
- infoaploxn@gmail.com
- +91 656 786 53
I want to call an endpoint like this:
```
const user = await api.get(’/users/:id’, { params: { id: 42 } }) // ^? User
```
No casting, no .json() dance, no stringly-typed params.
If I typo the path or forget a required query, the red squiggles save me before I hit save.
We’ll use a small schema object instead of a swagger file:
```
// apiSchema.ts export interface ApiSchema { ’/users/:id’: { get: { params: { id: number } resp: User } } ’/posts’: { get: { query: { page?: number } resp: Post[] } post: { body: CreatePost resp: Post } }
}
```
That’s it—no code-gen, no extra tooling.
```
// apiClient.ts type Method = ’get’ | ’post’ | ’put’ | ’patch’ | ’delete’ type PathParams<Path extends string> = Path extends `${string}:${infer Param}/${infer Rest}` ? { [K in Param | keyof PathParams<Rest>]: string | number } : Path extends `${string}:${infer Param}` ? { [K in Param]: string | number } : never type Endpoint<M extends Method, P extends keyof ApiSchema> = ApiSchema[P][M] extends { params: infer Pr } ? { params: Pr } : ApiSchema[P][M] extends { query: infer Q } ? { query: Q } : ApiSchema[P][M] extends { body: infer B } ? { body: B } : {} async function apiCall<M extends Method, P extends keyof ApiSchema>( method: M, path: P, ...[args]: keyof Endpoint<M, P> extends never ? [] : [opts: Endpoint<M, P>] ) { let url = path as string const opts = (args || {}) as any // 1. fill path params if (opts.params) { for (const [k, v] of Object.entries(opts.params)) { url = url.replace(`:${k}`, encodeURIComponent(String(v))) } } // 2. build fetch options const init: RequestInit = { method: method.toUpperCase() } if (opts.body) init.body = JSON.stringify(opts.body) if (opts.query) { url += ’?’ + new URLSearchParams(opts.query as any).toString() } // 3. fetch & validate const res = await fetch(url, init) if (!res.ok) throw new Error(res.statusText) return (await res.json()) as ApiSchema[P][M][’resp’] } // tiny wrappers for each verb export const api = { get: <P extends keyof ApiSchema>(p: P, ...a: any[]) => apiCall(’get’, p, ...a), post: <P extends keyof ApiSchema>(p: P, ...a: any[]) => apiCall(’post’, p, ...a), // …add the rest if you need them }
```
Count the lines—29 without comments.
Drop it in your project and you’re done.
```
// anywhere.ts const user = await api.get(’/users/:id’, { params: { id: 42 } }) // ^? User const posts = await api.get(’/posts’, { query: { page: 2 } }) // ^? Post[] const newPost = await api.post(’/posts’, { body: { title: ’Hello TS’ } }) // ^? Post
```
Misspell id? TS yells.
Forget the body? TS yells.
Wrong HTTP verb? TS yells.
It’s like GraphQL, minus the schema language.
Because we still call fetch, everything works in the browser or Node.
Add zod or io-ts inside apiCall if you want runtime validation too—still under 50 lines total.
Copy the two files above, adjust ApiSchema to your endpoints, and delete every hand-rolled fetch wrapper cluttering your repo.
Type-safe, zero deps, and you wrote it yourself in the time it took to sip a coffee.
Not bad for 30 lines.
Imagine reducing your operational costs by up to $100,000 annually without compromising on the technology you rely on. Through our partnerships with leading cloud and technology providers like AWS (Amazon Web Services), Google Cloud Platform (GCP), Microsoft Azure, and Nvidia Inception, we can help you secure up to $25,000 in credits over two years (subject to approval).
These credits can cover essential server fees and offer additional perks, such as:
By leveraging these credits, you can significantly optimize your operational expenses. Whether you're a startup or a growing business, the savings from these partnerships ranging from $5,000 to $100,000 annually can make a huge difference in scaling your business efficiently.
The approval process requires company registration and meeting specific requirements, but we provide full support to guide you through every step. Start saving on your cloud infrastructure today and unlock the full potential of your business.