TypeScript
Elysia 开箱即用支持 TypeScript。
大多数情况下,你无需手动添加任何 TypeScript 注解。
推断
Elysia 会根据你提供的 Schema 推断请求和响应的类型。
ts
import { Elysia, t } from 'elysia'
import { z } from 'zod'
const app = new Elysia()
.post('/user/:id', ({ body }) => body, {
body: t.Object({
id: t.String()
}),
query: z.object({
name: z.string()
})
})Elysia 可以自动从诸如 TypeBox 和你喜欢的验证库(参见 标准 Schema)的 Schema 中推导类型,例如:
- Zod
- Valibot
- ArkType
- Effect Schema
- Yup
- Joi
Schema 转 Type
Elysia 支持的所有 Schema 库都可以转换成 TypeScript 类型。
ts
import { Elysia, t } from 'elysia'
const User = t.Object({
id: t.String(),
name: t.String()
})
type User = typeof User['static']
类型性能
Elysia 的设计考虑了类型推断性能。
在每次发布前,我们都会进行本地基准测试,确保类型推断快速流畅,不会让你的 IDE 报“类型实例化过深且可能无限”的错误。
大部分使用 Elysia 的时间里,你不会遇到任何类型性能问题。
不过如果遇到了,可以按照以下步骤来排查哪些部分拖慢了类型推断:
- 进入项目根目录,运行
tsc --generateTrace trace --noEmit --incremental false这会在项目根目录生成一个名为 trace 的文件夹。
- 打开 Perfetto UI,将
trace/trace.json文件拖入页面。

界面会显示类似火焰图的内容
找到耗时较长的部分,点击查看它的推断时间、来源的文件和行号。
这样可以帮助定位类型推断的性能瓶颈。
Eden
如果你在使用 Eden 时遇到类型推断缓慢问题,可以尝试用 Elysia 的子应用来隔离类型推断。
ts
import { Elysia } from 'elysia'
import { plugin1, plugin2, plugin3 } from from './plugin'
const app = new Elysia()
.use([plugin1, plugin2, plugin3])
.listen(3000)
export type app = typeof app
// 导出子应用
export type subApp = typeof plugin1 在前端,你可以导入子应用而非整个应用。
ts
import { treaty } from '@elysiajs/eden'
import type { subApp } from 'backend/src'
const api = treaty<subApp>('localhost:3000') 这能让类型推断更快,因为不必推断整个应用。
详见 Eden Treaty 了解更多关于 Eden 的内容。