我最近发现并开始测试创建-T3-应用程序作为NextJS项目的一个新的基础,因为它为TypeScript、trpc、prisma和next-auth这样的东西提供了大量的样板设置,这样可以节省我大量的时间。虽然这是相关的,但我不认为这是我问题的根源。我的问题是,我使用具有自动递增用户id的MySQL数据库,但next-auth包的类型似乎迫使我使用字符串( next-auth/core/types.d.ts中的DefaultUser和next-auth/adapters.d.ts中的AdapterUser )都将id类型设置为string,注释说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中,它给了我这个错误。
输入'string \ number‘不能分配给输入'number’。输入“string”不能指定输入‘number’. to (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)如果我从TypeScript中删除AdapterUser中的id: string;行,那么next-auth/adapters.d.ts错误就会消失,然后返回到id: number;,因为我在User上设置了这一行。
export interface AdapterUser extends User {
id: string; // <-- I removed this
email: string;
emailVerified: Date | null;
}我不认为我应该修改库的类型来支持数字用户ID,但是我完全没有解决这个问题的想法,也没有在网上找到答案。或者,即使数据库使用数字I,也不应该使用数字I?如果有用的话,我在用
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发布于 2022-10-29 21:06:29
不幸的是,“修补”或更改库所具有的类型似乎是不可能的--甚至试图更改NextAuthOptions也无法工作,因为后续的属性定义必须具有相同的类型。同时,您必须使用运行时检查/强制或强制转换:
export const authOptions: NextAuthOptions = {
// Include user.id on session
callbacks: {
session({ session, user }) {
if (session.user) {
if (typeof user.id !== "number") throw new Error("id should a number");
session.user.id = user.id // OK
// session.user.id = +user.id // more dangerous but still works
// session.user.id = user.id as number // also dangerous
}
return session
}
},
adapter: PrismaAdapter(prisma),
providers: []
}https://stackoverflow.com/questions/74147383
复制相似问题