Apptiva Logo

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 am von Patrik Stutz


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
})