ClientQuickstart

Quickstart Guide

Welcome to the feTS Client, a fully type-safe HTTP Client that leverages the OpenAPI specification. It automatically infers types from the document, providing you with a type-safe interface for seamless API interaction.

Installation

To install the feTS Client, use the following command:

npm i fets

Usage with Existing REST API

Before diving in, make sure that you have an OpenAPI document, which is a language-agnostic specification for HTTP APIs. You can usually retrieve it from your server, or manually create it if you’re familiar with the OpenAPI schema. Check out the OpenAPI docs to learn more.

Start by creating a TypeScript file that exports your OpenAPI document. Due to certain limitations in TypeScript, importing types directly from JSON files isn’t currently supported (see this issue). To work around this, simply copy and paste the content of your OpenAPI file into the TypeScript file and then export it with the as const modifier.

openapi.ts
export default { openapi: '3.0.0' /* ... */ } as const

Next, create a client instance by passing the OpenAPI document to the createClient function.

import { createClient, type NormalizeOAS } from 'fets'
import type openapi from './openapi'
 
const client = createClient<NormalizeOAS<typeof openapi>>({})
 
const response = await client['/pets'].get()
 
const pets = await response.json()
console.log(pets)
⚠️

If you get This node exceeds the maximum length error from TypeScript, you need to add disableSizeLimit: true to compilerOptions in your tsconfig.json file.

React Native / Expo

feTS Client is Fetch-based and does not depend on Node-only APIs. Reported React Native / Expo crashes have usually come from Metro failing to resolve @sinclair/typebox (or a TypeBox subpath such as @sinclair/typebox/compiler) to a build Hermes can load—not from feTS itself.

If you hit that, configure Metro’s custom resolveRequest (or equivalent) so TypeBox resolves to the package entry that works in your Expo/RN version. extraNodeModules alone only remaps package roots; it does not override package.json exports selection.

feTS does not ship first-class React Native shims.

Usage with feTS Server

If you’re using feTS Server, and you’re sharing the types of your router instance, you can infer types directly from there.

import { createClient } from 'fets'
// Remember to add `type` to import types only.
import type { router } from './router'
 
const client = createClient<typeof router>({
  endpoint: 'http://localhost:3000'
})
 
const response = await client['/pets'].get()
const pets = await response.json()
console.log(pets)

This quick start guide should provide you with a solid foundation for using feTS Client. Enjoy exploring its full potential!