NextAuth会话添加自定义字段遇TS报错:isAdmin属性不存在求助
解决NextAuth会话添加自定义字段的TypeScript类型问题
要在NextAuth会话中添加自定义字段并解决TypeScript报错,核心是扩展NextAuth的默认类型定义,具体步骤如下:
1. 创建NextAuth类型扩展文件
在项目中创建一个类型声明文件(比如types/next-auth.d.ts或直接放在根目录),用于扩展NextAuth的Session和JWT类型:
import NextAuth from "next-auth"; import { ObjectId } from "mongodb"; // 若使用MongoDB的ObjectId则引入,否则替换为string类型 declare module "next-auth" { // 自定义会话中的用户结构 interface User { id: ObjectId | string; username: string; img?: string; isAdmin: boolean; // 可按需添加其他字段,如isActive、phone等 } // 扩展Session类型,让user字段使用自定义的User类型 interface Session { user: User; } } // 扩展JWT类型,确保JWT字段与自定义User匹配 declare module "next-auth/jwt" { interface JWT { id: ObjectId | string; username: string; img?: string; isAdmin: boolean; } }
2. 优化NextAuth配置的类型定义
替换原配置中的any类型,使用明确的自定义类型,提升类型检查严谨性:
首先定义数据库返回的用户类型:
import { ObjectId } from "mongodb"; interface CustomUser { _id: ObjectId; username: string; email: string; password: string; isAdmin: boolean; isActive: boolean; phone: string; address: string; img?: string; }
然后修改NextAuth配置的回调函数:
export const { signIn, signOut, auth } = NextAuth({ ...authConfig, providers: [ CredentialsProvider({ async authorize(credentials) { try { const user = await login(credentials) as CustomUser; // 仅传递需要的字段到jwt回调 return { id: user._id, username: user.username, img: user.img, isAdmin: user.isAdmin, email: user.email, }; } catch (error) { return null; } }, }), ], callbacks: { async jwt({ token, user }) { if (user) { token.id = user.id; token.username = user.username; token.img = user.img; token.isAdmin = user.isAdmin; } return token; }, async session({ session, token }) { if (token) { session.user = { id: token.id, username: token.username, image: token.img, isAdmin: token.isAdmin, email: session.user?.email, // 保留默认email字段(按需取舍) }; } return session; }, }, });
3. 使用扩展后的会话类型
现在调用auth()获取会话时,TypeScript会自动识别自定义字段,不再报错:
const session = await auth(); console.log(session?.user?.isAdmin); // 正常编译,无类型错误
关键说明
- NextAuth默认的
Session和JWT类型是固定的,必须通过模块扩展告知TypeScript自定义字段的存在。 - 若类型声明文件放在
types目录,需确保tsconfig.json中配置了include: ["types/**/*"],让TypeScript能识别到。 - 避免在回调中使用
any类型,明确的类型定义能提前排查大部分类型错误。
内容的提问来源于stack exchange,提问作者Tejendra Singh Rajawat
相关产品推荐
相关产品推荐

