Issue
I’m looking for a way to define a Prisma select statement and then use it in multiple places. For example:
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
}
}
})
However, this isn’t working properly. When using userSelect
in the queries, the queries know userSelect
is of the expected type Prisma.UserSelect
, but they don’t know which fields have actually been selected. This ends up typing both user
and posts.user
to be {}
.
A different approach would be to instead write userSelect
like this:
const userSelect = {
id: true,
name: true,
} as const;
That works in the query and correctly types the query result. However, now I lose type safety and autocomplete in the definition of userSelect
.
Can someone think of a solution that would work correctly in the query select property, the query result, and that would also allow type safety in the definition of the select object?
Solution
In TS 4.9+, you would use satisfies
for this:
const userSelect = { ... } satisfies Prisma.UserSelect;
This maintains the type of userSelect
while still checking and autocompleting inside the brackets.
The canonical solution to this problem in TS4.8 is to use a generic helper function:
function makeUserSelect<T extends Prisma.UserSelect>(t: T): T { return t; }
const userSelect = makeUserSelect({ ... });
Answered By - caTS
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.