Search code examples
prisma

get full type on prisma client


When i generate my prisma client with prisma generate, i got an index.d.ts with all types from my database. But the probleme is that all type are "single" and there is no relations. When i query something like

prisma.users.findMany({
            [... ]
            include: {
                cars: {
                  [...]
                }}});

prisma type the response dynamically with the right type

users & {
        cars: cars & {
           [...]
        };
    }

So everything work well and I have the auto completion, except if I want to pass this variable to another method, I would like to type the parameters, so I have to create my own type used as method parameter.

type prismaUsers = users & {
        cars?: cars & {
           [...]
        };
    }

But I'm asking if there is a way to get the "full" type from prisma to avoid me to create all "full" types with optionals sub-elements like I did for the user example. Or maybe i'm doing wrong and there is another way to do?


Solution

  • An alternate method (my preferrence) to get the "full" type, or the model with all of its possible relations, is to use the GetPayload version of your model type. The type is a generic that can receive the same object you pass to your query.

    import { PrismaClient, Prisma } from "@prisma/client";
    
    const prisma = new PrismaClient();
    
    type UserWithCars = Prisma.UserGetPayload<{
      include: {
        cars: true;
      }
    }>
    
    const usersWithCars = await prisma.user.findMany({
      include: {
        cars: true,
      }
    });
    

    As your query grows more complex, you may want to abstract it and ensure that it is strongly typed.

    import { Prisma, PrismaClient } from "@prisma/client";
    
    const prisma = new PrismaClient();
    
    const userInclude = Prisma.validator<Prisma.UserInclude>()({
      cars: true,
    });
    
    type UserWithCars = Prisma.UserGetPayload<{
      include: typeof userInclude;
    }>;
    
    const usersWithCars = await prisma.user.findMany({
      include: userInclude,
    });