You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:05:24