Traducción de la página original en inglés. Si algo no cuadra, prevalece la versión en inglés.
Clientes tipados
DaloyJS ofrece dos formas de llamar a tu API con seguridad de tipos completa. Usa la que encaje con tu consumidor.
1. Cliente tipado en proceso (sin generación de código)
Para consumidores en TypeScript dentro del mismo monorepo (pruebas, herramientas internas, server actions de Next.js):
El cliente se indexa por operationId, devuelve una unión discriminada de {status, body, headers} e infiere todo a partir de la propia definición de la ruta. Sin paso de build.
Parámetros de ruta
Los parámetros de ruta se sustituyen por segmentos completos, así que :id nunca coincide dentro de :idx, y cada valor se codifica con porcentajes en su propio segmento. Desde la 1.3.7, un método generado lanza un TypeError, antes de enviar ninguna petición, cuando un parámetro falta, está vacío o es . o ... El parseo de URL resolvería un segmento de punto (incluso como %2E%2E) y cambiaría en silencio el destino de la llamada, por ejemplo convirtiendo DELETE /orgs/:org/members/.. en DELETE /orgs/:org. Las rutas comodín (*path, o un * a secas con el nombre wildcard) aceptan un valor separado por /; cada segmento se codifica y se comprueba de la misma forma.
2. SDK de Hey API (entre lenguajes, entre repositorios, en tiempo de build)
Para los consumidores que están fuera del monorepo o en otros lenguajes, genera un SDK fetch totalmente tipado con @hey-api/openapi-ts.
- 01Rutasapp.route(...)
- 02generateOpenAPI@daloyjs/core/openapi
- 03openapi.jsonespecificación OpenAPI 3.1 en disco
- 04openapi-tsgenerador de Hey API
- 05SDK tipadosdk.gen.ts · types.gen.ts
- 06Consumidorllamadas fetch totalmente tipadas
Usar el SDK generado
¿Cuál debo usar?
| Caso de uso | Elección |
|---|---|
| Código TypeScript en el mismo repositorio (pruebas, herramientas internas) | createInProcessClient |
| Aplicación web o bundle móvil de React Native en otro repositorio | SDK de Hey API |
| Consumidor que no usa TypeScript (Python, Swift, Kotlin) | Documento OpenAPI + su generador preferido |
| SDK público para terceros | SDK de Hey API, publicado como paquete propio |
¿Vienes de ts-rest?
ts-rest es una librería popular basada en contratos que te da tipos TypeScript de extremo a extremo sin generación de código compartiendo un contrato (initContract) entre un servidor basado en adaptadores (Express, Fastify, NestJS, Next.js) y un cliente fetch (initClient). Si te gusta ese modelo, DaloyJS te resultará familiar, con dos diferencias.
La primera: en DaloyJS la definición de la ruta es el contrato; no hay un objeto de contrato aparte que mantener sincronizado. El createClient en proceso que has visto arriba ofrece la misma experiencia sin generación de código y con tipos compartidos para el código TypeScript del mismo repositorio.
La segunda: la seguridad de tipos de ts-rest es solo para TypeScript y obliga al cliente a importar el contrato. DaloyJS emite una especificación OpenAPI 3.1 de primera clase y un SDK de Hey API a partir de las mismas rutas, así que también cubre a los consumidores que no pueden importar tus tipos (otros repositorios, otros lenguajes, SDK públicos). En ts-rest, OpenAPI es un complemento opcional (@ts-rest/open-api). Además, DaloyJS es el propio servidor y runtime, portable entre Node, Bun, Deno, Cloudflare y Vercel, y no una capa de tipos montada sobre otro framework.
| ts-rest | DaloyJS | |
|---|---|---|
| Origen del contrato | Objeto initContract aparte | La propia definición de la ruta |
| Cliente tipado sin generación de código | Sí (initClient, solo TypeScript) | Sí (createClient, solo TypeScript) |
| Clientes entre lenguajes / entre repositorios | Complemento de OpenAPI (@ts-rest/open-api) | OpenAPI 3.1 + SDK de Hey API, de primera clase |
| Servidor | Adaptador sobre Express / Fastify / NestJS / Next.js | Integrado y portable entre runtimes |
| Validación en tiempo de ejecución | Standard Schema (Zod / Valibot / ArkType) | Standard Schema (Zod / Valibot / ArkType / TypeBox) |
| Seguridad por defecto | Te la montas tú | Cabeceras y límites de cuerpo activados por defecto; CSRF y limitación de peticiones a una línea |
¿Necesitas un contrato más grande para validar lo que genera tu generador? Usa la demo REST falsa de gran tamaño (en inglés) como caso de estrés en lugar de una aplicación mínima de tutorial.
Última actualización: