使用Prisma关联findUnique查询时TS类型不匹配,如何解决?
解决Prisma查询返回类型与UserGetPayload不兼容的问题
问题原因
你用Prisma.UserGetPayload生成的类型包含了Prisma为关联字段自动添加的懒加载查询方法(比如currentStates()),但实际执行带include的查询后,返回的currentStates是已加载的数组,两者类型不匹配,导致TS2322错误。
推荐解决方案:用Prisma.GetReturnType推导精确类型
直接基于你的查询配置,使用Prisma.GetReturnType生成和实际返回结果完全匹配的类型,这是最准确且无需手动维护的方式:
// 定义你的查询配置,并通过satisfies约束类型 const userQueryOptions = { where: { id: userId }, include: { currentStates: { include: { state: true }, }, }, } satisfies Prisma.UserFindUniqueArgs; // 基于查询方法和配置,推导精确返回类型 type UserWithCurrentStates = Prisma.GetReturnType< typeof prisma.user.findUnique, typeof userQueryOptions >; // 现在可以正常使用该类型 type InnerContextProps = { user: UserWithCurrentStates | null; };
备选方案:手动修正UserGetPayload类型
如果坚持使用UserGetPayload,可以手动覆盖关联字段的类型,替换掉Prisma的懒加载方法:
type UserWithCurrentStates = Omit< Prisma.UserGetPayload<{ include: { currentStates: { include: { state: true } } }; }>, 'currentStates' > & { currentStates: Array<Prisma.CurrentStateGetPayload<{ include: { state: true } }>>; };
这种方法需要手动维护关联字段的类型,不如第一种方案灵活。
内容的提问来源于stack exchange,提问作者Alan Sikora
相关产品推荐
相关产品推荐

