使用Next-auth v5.0.0-beta.5时Session回调出现TypeScript类型错误
解决NextAuth v5.0.0-beta.5 Session回调TypeScript类型错误
问题根源
NextAuth v5的类型扩展机制和v4完全不同,你沿用v4的declare module扩展方式会导致类型不兼容,另外代码里还有两处细节问题:
- 自定义
User接口覆盖了默认类型,引发类型冲突 Session中的expires类型未正确定义(默认应为string,你使用的DateTime未导入或声明)
修正步骤
1. 调整类型扩展文件(auth.d.ts)
替换原有扩展代码为v5兼容写法,通过交叉类型扩展默认类型,避免覆盖冲突:
import type { DefaultSession, DefaultJWT } from "next-auth"; // 扩展Session类型 declare module "next-auth" { interface Session extends DefaultSession { user: DefaultSession["user"] & { accessToken?: string; department?: string; jobTitle?: string; companyName?: string; }; // v5默认expires为string类型,若你需要DateTime需自行导入对应库(如luxon)并声明 expires: string; } } // 扩展JWT类型 declare module "next-auth/jwt" { interface JWT extends DefaultJWT { accessToken?: string; department?: string; jobTitle?: string; companyName?: string; } }
2. 确保类型文件被TypeScript识别
检查tsconfig.json的include数组,确保auth.d.ts在其中:
{ "include": ["auth.d.ts", "**/*.ts", "**/*.tsx"] }
3. 简化Session回调的类型声明
v5会自动推断回调参数类型,也可显式导入正确类型:
import type { Session, JWT } from "next-auth"; // 在auth配置的session回调中 async session({ session, token }: { session: Session; token: JWT }) { session.user.accessToken = token.accessToken || ""; session.user.department = token.department || ""; session.user.companyName = token.companyName || ""; session.user.jobTitle = token.jobTitle || ""; return session; },
额外说明
- 不要重新定义
User接口,直接扩展DefaultSession["user"]即可保留默认类型的同时添加自定义字段 - 若坚持使用
DateTime类型,需安装对应库(如luxon)并在auth.d.ts中导入:import type { DateTime } from "luxon";
内容的提问来源于stack exchange,提问作者Paulius
相关产品推荐
相关产品推荐

