TypeScript错误TS2339:Elysia路由中类型不存在user属性问题求助
TypeScript错误TS2339:Elysia路由中类型不存在user属性问题求助
看起来你在Elysia框架里使用自定义认证中间件时遇到了TypeScript类型推断的问题,这个TS2339错误本质是TypeScript没法自动识别中间件注入的user和session属性类型,下面我来帮你一步步解决这个问题:
问题原因
Elysia的derive方法虽然能在运行时给上下文注入user和session,但TypeScript需要明确的类型声明才能感知这些新增的上下文属性。你的authMiddleware没有给Elysia的上下文类型做扩展,所以路由里的上下文对象自然不会包含user的类型定义。
解决方案
1. 定义并扩展Elysia上下文类型
首先创建一个类型文件(比如src/types/auth.ts),或者直接在认证中间件文件里添加类型声明,扩展Elysia的默认上下文类型:
// 先根据你的业务定义User和Session的具体类型 export type User = { id: string; username: string; email: string; }; export type Session = { id: string; fresh: boolean; // 其他session属性根据lucia的配置补充 }; // 扩展Elysia的上下文类型 declare module "elysia" { interface Context { user: User | null; session: Session | null; } }
2. 让认证中间件返回对齐的类型
修改isAuthenticated.ts,导入上面定义的类型,明确derive方法的返回类型,确保和扩展的上下文类型一致:
import { Elysia } from "elysia"; import { lucia } from "../../services/auth.service"; import type { User, Session } from "../types/auth"; // 导入自定义类型 export const authMiddleware = new Elysia({ name: "auth" }).derive( async ({ request, set }): Promise<{ user: User | null; session: Session | null }> => { const cookieHeader = request.headers.get("cookie") ?? ""; const sessionId = lucia.readSessionCookie(cookieHeader); if (!sessionId) { return { user: null, session: null }; } const { session, user } = await lucia.validateSession(sessionId); if (session && session.fresh) { const sessionCookie = lucia.createSessionCookie(session.id); set.headers["Set-Cookie"] = sessionCookie.serialize(); } if (!session) { const sessionCookie = lucia.createBlankSessionCookie(); set.headers["Set-Cookie"] = sessionCookie.serialize(); } return { user, session }; } );
3. 在路由中明确上下文类型(可选但推荐)
在user.routes.ts里,你可以给处理函数添加上下文类型提示,让TypeScript更清晰地识别user属性:
import { Elysia } from "elysia"; import { authMiddleware } from "../middleware/isAuthenticated"; import type { Context } from "elysia"; // 导入扩展后的上下文类型 export const usersRoutes = new Elysia({ prefix: "/users" }) .use(authMiddleware) .guard( { beforeHandle: ({ set, user }: Context) => { if (!user) { set.status = 401; return "Unauthorized"; } }, }, (app) => app.get("/me", ({ user }: Context) => { return { user: { id: user.id, username: user.username, email: user.email, }, }; }) );
做完这些步骤后,保存所有文件,TypeScript应该就能正确识别user属性了,TS2339的错误也会消失。
内容来源于stack exchange
相关产品推荐
相关产品推荐

