在ElysiaJS分离路由文件中使用JWT插件时如何保持类型安全?
解决ElysiaJS分离路由中JWT的类型错误问题
ElysiaJS本身提供了内置的类型继承机制来解决这个问题,不需要自定义全局index.d.ts,核心是通过类型传递让分离的路由继承主应用的插件类型。
步骤1:主应用导出类型
在主文件(index.ts)中,创建并配置带有JWT插件的Elysia实例后,导出该实例的类型:
import { Elysia } from 'elysia' import { jwt } from '@elysiajs/jwt' // 配置主应用并挂载JWT插件 const app = new Elysia() .use(jwt({ secret: 'your-secure-secret-key' })) // 导出主应用的类型,供路由继承 export type AppInstance = typeof app app.listen(3000)
步骤2:分离路由继承主应用类型
在分离的路由文件(如routes/auth/index.ts)中,创建Elysia路由实例时,通过.extends<AppInstance>()继承主应用的类型,这样就能识别JWT插件的类型定义:
import { Elysia } from 'elysia' import type { AppInstance } from '../../index' const authRoutes = new Elysia({ prefix: '/auth' }) // 继承主应用的类型,包含JWT插件的类型信息 .extends<AppInstance>() .post('/login', async ({ jwt, body }) => { // 此处jwt会拥有完整的类型提示,不再出现类型错误 const token = await jwt.sign({ userId: body.userId }) return { token } }) export default authRoutes
步骤3:主应用挂载分离路由
回到主文件,将分离的路由挂载到主应用上:
// index.ts中添加路由挂载逻辑 import authRoutes from './routes/auth' const app = new Elysia() .use(jwt({ secret: 'your-secure-secret-key' })) .use(authRoutes) // 挂载认证路由 export type AppInstance = typeof app app.listen(3000)
原理说明
.extends<T>()是ElysiaJS内置的类型扩展方法,它会将主应用实例的所有插件类型、上下文类型传递给子路由实例,让子路由能正确识别jwt这类插件注入的上下文属性,完全符合类型安全要求,是官方推荐的优雅解决方案。
内容的提问来源于stack exchange,提问作者codingIsLove
相关产品推荐
相关产品推荐

