扩展next-auth的User接口报错:User不存在'id'属性,求原因
问题解析:NextAuth扩展User接口后提示
id不存在的原因及解决方法 根本原因
你的NextAuth类型扩展未被TypeScript正确识别或合并,导致session.user的类型仅包含你自定义的username字段,丢失了原NextAuth User接口自带的id、name等默认字段。
具体来说有两种可能:
- 你的
next-auth.d.ts类型文件不在TypeScript的扫描范围内,扩展规则未生效; - Session接口的扩展写法有误,直接覆盖了原Session中user字段的默认类型,导致原有字段丢失。
解决步骤
1. 确保TypeScript加载扩展文件
检查项目根目录的tsconfig.json,确认include数组包含next-auth.d.ts:
{ "include": ["next-auth.d.ts", "src/**/*"] }
这能保证TypeScript读取并应用你的类型扩展规则。
2. 修正类型扩展的写法
按照NextAuth官方规范编写扩展,确保接口合并生效,同时保留原类型的所有字段:
import "next-auth"; import { DefaultSession } from "next-auth"; declare module "next-auth" { // 合并原User接口,添加自定义username字段 interface User { username: string; } // 扩展Session接口,确保user字段包含原DefaultSession.user的全部字段 + 自定义username interface Session extends DefaultSession { user: User; } }
或者更简洁的方式,直接合并user字段的类型:
import "next-auth"; declare module "next-auth" { interface User { username: string; } interface Session { user: User & DefaultSession["user"]; } }
3. 验证GraphQL上下文的Session类型
检查GraphQLContextInterface,确保其中的session字段使用扩展后的NextAuth Session类型:
import { Session } from "next-auth"; import { PrismaClient } from "@prisma/client"; export interface GraphQLContextInterface { prisma: PrismaClient; session: Session | null; // 其他上下文字段 }
完成以上修改后,TypeScript会正确识别session.user包含id和username字段,无需显式类型转换即可访问session.user.id。
内容的提问来源于stack exchange,提问作者Blitva
相关产品推荐
相关产品推荐

