我正在寻找一种方法来定义Prisma select语句,然后在多个地方使用它。例如:
const userSelect: Prisma.UserSelect = {
id: true,
name: true,
}
const user = await prisma.user.findUnique({
where: { id: 1 },
select: userSelect
})
const posts = await prisma.post.findMany({
where: { authorId: 1 },
select: {
id: true,
user: {
select: userSelect
}
}
})
但是,这并不能正常工作。当在查询中使用userSelect
时,查询知道userSelect
是预期的类型Prisma.UserSelect
,但它们不知道实际上选择了哪些字段。这最终导致user
和posts.user
都被键入为{}
。
另一种方法是将userSelect
写成如下形式:
const userSelect = {
id: true,
name: true,
} as const;
这在查询中起作用,并正确地键入查询结果。然而,现在我在userSelect
的定义中失去了类型安全和自动完成功能。
有人能想出一个解决方案,它能在查询select属性、查询结果中正常工作,并且还能在select对象的定义中允许类型安全吗?
3条答案
按热度按时间k4emjkb11#
Prisma刚刚发布了一篇涵盖这一确切主题的文章。https://www.prisma.io/blog/satisfies-operator-ur8ys8ccq7zb
引用文章:
Prisma中的satisfes操作符最常见的用例之一是推断特定查询方法(如findUnique)的返回类型-仅包括模型及其关系的选定字段。
jutyujz02#
在TS 4.9+中,您可以使用
satisfies
来执行以下操作:这会保留
userSelect
的类型,同时仍会检查并自动完成括号内的内容。TS4.8中这个问题的标准解决方案是使用一个通用的helper函数:
pcrecxhr3#
第一个
应正确键入,您可以在必要时使用
UserSelect
类型。