Prisma: Wie das neue “satisfies”-Keyword helfen kann
Wenn man Prisma verwendet, schreibt man oft viele Queries mit den selben “includes”, oder “selects”. Das neue “satisfies”-Keyword kann hier Abhilfe schaffen.
Publiziert von Patrik Stutz am 21.08.2023
Wer in seinem Projekt Prisma benutzt, dem dürfte folgende Situation nicht fremd sein:
const makeUserRepository = ()=>({
getUserById: async (userId: string)=>{
return await prisma.findUnique({
where:{userId},
include:{roles: true, supervisors: true}
})
},
getAll: async ()=>{
return await prisma.findAll({
include: {roles: true, supervisors: true}
})
})
})
In solchen Queries werden meistens immer die selben “include”s verwendet. In diesem Fall ist es immer {roles: true, supervisors: true}
. Mit der Verwendung von satisfies
kann man dies nun ganz einfach in eine Variable auslagern und wiederverwenden:
const include = {roles: true, supervisors: true} satisfies Prisma.UserInclude // typensicher
const makeUserRepository = ()=>({
getUserById: async (userId: string)=>{
return await prisma.findUnique({
where:{userId},
include
})
},
getAll: async ()=>{
return await prisma.findAll({
include
})
})
})
Wenn man jetzt noch eine Funktion hat, welche die zurückgegebenen Objekte in ein “Domain-Objekt” umwandelt, kann man dies mittels des generierten [ModelName]GetPayload
Utility-Typs ebenfalls ganz einfach abbilden:
const include = {roles: true, supervisors: true} satisfies Prisma.UserInclude
const makeUserRepository = ()=>({
getUserById: async (userId: string)=>{
return await prisma.findUnique({
where:{userId},
include
})
},
getAll: async ()=>{
return await prisma.findAll({
include
})
})
})
const prismaUserToDomainUser = (prismaUser: Prisma.UserGetPayload<{include: typeof include}>) => ({
...prismaUser,
roleCount: prismaUser.roles.length // typescript weiss nun, dass prismaUser die property "roles" hat
})