【发布时间】:2023-02-06 13:36:09
【问题描述】:
我最近发现并开始测试 create-t3-app 作为 NextJS 项目的新基础,因为它负责 TypeScript、trpc、prisma 和 next-auth 等大量样板设置,因此可以节省我大量时间。虽然这是相关的,但我认为这不是我问题的根源。我的问题是我使用的 MySQL 数据库具有自动递增的用户 ID,但似乎 next-auth 包的类型迫使我使用字符串(next-auth/core/types.d.ts 中的 DefaultUser 和 next-auth/adapters.d.ts 中的 AdapterUser两者都将 id 的类型设置为字符串,并且 cmets 都说 UUID)。考虑到我可能会扩展那里的内容以支持数字用户 ID,我将其添加到 next-auth.d.ts:
import { DefaultSession, DefaultUser } from 'next-auth'
declare module 'next-auth' {
interface User extends DefaultUser {
id: number;
}
interface Session {
user?: {
id: number;
} & DefaultSession['user'];
}
}
这似乎在大多数地方都有效,除了在[...nextauth].ts 中它给了我这个错误
输入'字符串| number' 不能分配给类型 'number'。类型“字符串”不可分配给类型“数字”.ts(2322)
在这一段代码的
session.user.id = user.id行export const authOptions: NextAuthOptions = { // Include user.id on session callbacks: { session({ session, user }) { if (session.user) { session.user.id = user.id } return session } }, adapter: PrismaAdapter(prisma), providers: [] } export default NextAuth(authOptions)如果我从
next-auth/adapters.d.ts中删除AdapterUser中的id: string;行,TypeScript 错误就会消失,然后回退到id: number;,因为我将其设置为Userexport interface AdapterUser extends User { id: string; // <-- I removed this email: string; emailVerified: Date | null; }我不认为我应该修改库的类型来支持数字用户 ID,但我完全不知道如何解决这个问题,也没有在网上找到答案。还是我不应该使用数字 ID,即使我的数据库使用了数字 ID?如果有帮助,我正在使用
next 12.3.1 next-auth 4.12.3 react 18.2.0 react-dom 18.2.0 superjson 1.9.1 zod 3.18.0 eslint 8.22.0 postcss 8.4.14 prettier 2.7.1 prisma 4.4.0 tailwindcss 3.1.6 typescrypt 4.8.0
【问题讨论】:
-
为什么不将 ID 字符串化?
-
@caTS 似乎和我当前的解决方案一样笨拙,带有额外的操作,特别是考虑到文档和 cmets 表明 id 旨在成为 UUID。
-
@DillanWilding UUID 是类似于“123e4567-e89b-12d3-a456-426614174000”的字符串。您是否尝试将
User.id声明为number | string并更新与... = parseInt(user.id, 10)的比较 -
@IQbrod 我知道 UUID 是什么。问题不在于
User上的 id 不是数字(或字符串),而是next-auth提供的 TypeScript 类型已将用户 ID 类型传播到其他类型,例如AdapterUser(我认为其他几个地方)当我想将其更改为数值时会引起问题。如果他们在扩展User时没有指定 id 的类型,它将默认/回退到User上指定的类型,但由于他们说id: string;它会导致问题。 -
@dillanwilding 你应该考虑在他们的项目上提出一个问题和/或一个拉取请求,因为如果不更新库的代码就无法解决这个问题
标签: typescript next.js next-auth