unicorn_surprise
unicorn_surprise

Reputation: 1109

Property is missing in type prisma/client/index, when adding a custom type to Prisma schema

My custom type "Observations" doesn't seem to be generating correctly as I am getting this error message

Property 'observations' is missing in type 'import("/Users/thomasandrew/Documents/webApps/social-innovate/boilerplate/packages/api/node_modules/.prisma/client/index").ActionPlan' but required in type 'import("/Users/thomasandrew/Documents/webApps/social-innovate/boilerplate/packages/api/src/modules/actionPlan/actionPlan.model").ActionPlan'.ts(2741) actionPlan.model.ts(25, 5): 'observations' is declared here.

This is my Prisma schema file (removed some extraneous fields)

model Observation {
  id                      String @id @default(dbgenerated("gen_random_uuid()"))
  actionPlan              ActionPlan  @relation(fields: [actionPlanId], references: [id])
  actionPlanId            String
  meetingDate             DateTime?
  place                   String?
}

model ActionPlan {
    id          String  @id @default(dbgenerated("gen_random_uuid()")) @unique
    testName    String
    observations Observation[]
}

type-graphql model

@ObjectType()
export class ActionPlan extends BaseModel implements Prisma.ActionPlan {
    @Field()
    testName: string

    @Field()
    department: string

    @Field()
    code: string

    @Field()
    outcome: string

    @Field()
    hypothesis: string

    @Field(type => [Observation])
    observations: Observation[]
}

However even when I run prisma generate successfully, it doesn't add the 'observations' to the Action Plan. Am I missing something? Any help would be great. I also attached screenshot of generated types at node_modules/.prisma/client/index.d.ts

enter image description here.

enter image description here

Upvotes: 4

Views: 6148

Answers (2)

Abdiel Araguayan
Abdiel Araguayan

Reputation: 176

Prisma doesn't include relationships in generated types because not all queries include them. Prisma queries do return relationships according options used, but in the generated code this is done through complex TypeScript.

But always you can define types with relationships included manually or using a combination of ReturnType<T> and Awaited<T> utilities.

Example defining manually:

type ActionPlanWithObservations = ActionPlan & {
  observations: Observation[]
}

Example using Awaited and ReturnType:

type ActionPlanWithObservations =
        Awaited<ReturnType<ActionPlanService["getActionPlan"]>>

Where ActionPlanService is:

class ActionPlanService {      
  getActionPlan(id: string) {
    return prisma.actionPlan.findFirst({
      where: {
         id,
      },
      include: {
         observations: true,
      }
    })
  }
}

Note: Awaited<T> utility is available since TypeScript 4.5

Upvotes: 3

air_ioannis
air_ioannis

Reputation: 185

Since you have a relation between those 2, your code should provide an include argument, so that your @Resolver & @Query can populate that entity in the response.
Also, I don't know if it is inside your ActionPlanService the prisma connection (probably yes, since you get this error).
So, for example, your first query should point to the this ActionPlanService function:

async getActionPlan(id: string): Promise<ActionPlan> {
   return await this.prismaService.actionPlan.findFirst({
      where: {
         id,
      },
      include: {
         observations: true,
      }
    });

or something similar, since I don't know how you connect with prisma in that service

Upvotes: 2

Related Questions