在NextAuth中实现用户角色遇TS2687错误:user声明修饰符不一致
解决NextAuth中Session用户角色扩展的TS2687错误
错误原因
你在两个文件中重复声明了next-auth模块的Session接口:
next-auth.d.ts中Session.user是可选属性(带?)auth.ts中Session.user是必填属性(不带?)
TypeScript要求同一模块的接口声明中,同名属性的修饰符(可选/必填)必须完全一致,因此触发TS2687错误。
解决方案
1. 移除auth.ts中的重复类型声明
删除auth.ts里的declare module "next-auth"代码块,只保留authOptions的业务逻辑:
修改后的auth.ts片段:
export const authOptions: NextAuthOptions = { callbacks: { session({ session, user }) { if (session?.user) { session.user.id = user.id; session.user.role = user.role; session.user.email = user.email; session.user.image = user.image; session.user.name = user.name; } return session; }, }, adapter: PrismaAdapter(prisma), providers: [ GoogleProvider({ clientId: env.GOOGLE_CLIENT_ID, clientSecret: env.GOOGLE_CLIENT_SECRET, }), // 其他登录提供者... ], };
2. 优化next-auth.d.ts的类型定义
简化类型扩展逻辑,避免冗余属性,直接继承默认类型并添加自定义字段:
import type { UserRole } from "@prisma/client"; import type { DefaultSession, DefaultUser } from "next-auth"; declare module "next-auth" { // 扩展Session接口,添加自定义的id和role字段 interface Session extends DefaultSession { user?: DefaultSession["user"] & { id: string; role: UserRole; }; } // 扩展User接口,匹配数据库用户结构 interface User extends DefaultUser { id: string; role: UserRole; } } // 可选:如果使用JWT会话策略,同步扩展JWT类型 declare module "next-auth/jwt" { interface JWT { id: string; role: UserRole; } }
3. 验证类型一致性
确保session回调中的赋值逻辑符合扩展后的类型:
- 保留
session?.user的空值判断,和扩展后的可选属性匹配 user已被扩展为包含id和role的类型,不会出现类型不兼容报错
内容的提问来源于stack exchange,提问作者Mossy82
相关产品推荐
相关产品推荐

