Tradução da página original em inglês. Em caso de divergência, vale a versão em inglês.
Clientes tipados
O DaloyJS oferece duas formas de chamar sua API com tipagem completa. Use a que combina com o seu consumidor.
1. Cliente tipado em processo (zero geração de código)
Para consumidores TypeScript no mesmo monorepo (testes, ferramentas internas, server actions do Next.js):
O cliente é indexado por operationId, devolve uma união discriminada de {status, body, headers} e infere tudo a partir da própria definição da rota. Sem etapa de build.
Parâmetros de caminho
Os parâmetros de caminho são substituídos por segmento inteiro, então :id nunca corresponde dentro de :idx, e cada valor é codificado com percent-encoding no próprio segmento. Desde a 1.3.7, um método gerado lança um TypeError, antes de qualquer requisição ser enviada, quando um parâmetro está ausente, vazio, ou é . ou ... O parsing de URL resolveria um segmento de ponto (mesmo como %2E%2E) e redirecionaria a chamada silenciosamente, por exemplo transformando DELETE /orgs/:org/members/.. em DELETE /orgs/:org. Rotas curinga (*path, ou um * sozinho chamado wildcard) aceitam um valor separado por /; cada segmento é codificado e verificado da mesma forma.
2. SDK Hey API (entre linguagens, entre repositórios, em tempo de build)
Para consumidores fora do monorepo ou em outras linguagens, gere um SDK fetch totalmente tipado com o @hey-api/openapi-ts.
- 01Rotasapp.route(...)
- 02generateOpenAPI@daloyjs/core/openapi
- 03openapi.jsonespecificação OpenAPI 3.1 em disco
- 04openapi-tsgerador Hey API
- 05SDK tipadosdk.gen.ts · types.gen.ts
- 06Consumidorchamadas fetch totalmente tipadas
Usando o SDK gerado
Qual devo usar?
| Caso de uso | Escolha |
|---|---|
| Chamador TypeScript no mesmo repositório (testes, ferramentas internas) | createInProcessClient |
| Aplicativo web / bundle mobile React Native em outro repositório | SDK Hey API |
| Consumidor que não usa TypeScript (Python, Swift, Kotlin) | Documento OpenAPI + o gerador preferido dele |
| SDK público para terceiros | SDK Hey API, publicado como pacote próprio |
Vindo do ts-rest?
O ts-rest é uma biblioteca popular orientada a contrato que oferece tipos TypeScript de ponta a ponta sem geração de código, compartilhando um contrato (initContract) entre um servidor baseado em adaptadores (Express, Fastify, NestJS, Next.js) e um cliente fetch (initClient). Se você gosta desse modelo, o DaloyJS vai parecer familiar, com duas diferenças.
Primeiro, no DaloyJS a definição da rota é o contrato: não existe um objeto de contrato separado para manter em sincronia. O createClient em processo mostrado acima oferece a mesma experiência sem geração de código e com tipos compartilhados para chamadores TypeScript no mesmo repositório.
Segundo, a tipagem do ts-rest é só TypeScript e exige que o cliente importe o contrato. O DaloyJS emite uma especificação OpenAPI 3.1 de primeira classe e um SDK Hey API a partir das mesmas rotas, então consumidores que não conseguem importar seus tipos (outros repositórios, outras linguagens, SDKs públicos) também ficam cobertos. No ts-rest, o OpenAPI é um complemento opcional (@ts-rest/open-api). O DaloyJS também é o próprio servidor e runtime, portável entre Node, Bun, Deno, Cloudflare e Vercel, e não uma camada de tipagem montada sobre outro framework.
| ts-rest | DaloyJS | |
|---|---|---|
| Origem do contrato | Objeto initContract separado | A própria definição da rota |
| Cliente tipado sem geração de código | Sim (initClient, só TypeScript) | Sim (createClient, só TypeScript) |
| Clientes entre linguagens / entre repositórios | Complemento OpenAPI (@ts-rest/open-api) | OpenAPI 3.1 + SDK Hey API, de primeira classe |
| Servidor | Adaptador sobre Express / Fastify / NestJS / Next.js | Embutido, portável entre runtimes |
| Validação em tempo de execução | Standard Schema (Zod / Valibot / ArkType) | Standard Schema (Zod / Valibot / ArkType / TypeBox) |
| Padrões de segurança | Por sua conta | Cabeçalhos e limites de corpo ativos por padrão; CSRF e rate limit a uma linha de distância |
Precisa de um contrato maior para validar a saída do seu gerador? Use a grande demo REST falsa (em inglês) como caso de estresse em vez de um aplicativo mínimo de tutorial.
Última atualização: