typescript - Hur returnerar jag rätt typ för nästlade inkluderar i Prisma?


Jag kan inte returnera rätt typ från en funktion när jag använder en fråga med nästlade inkluderingar. De nästlade fälten saknas. Jag använder en modell som liknar den här:

model Foo {
  id String @id @default(cuid())
  bar Bar[]
}

model Bar {
  id String @id @default(cuid())
  foo Foo @relation(fields: [fooId], references: [id], onDelete: Cascade, onUpdate: Cascade)
  fooId String
  baz Baz[]
}

model Baz {
  id String @id @default(cuid())
  bar Bar @relation(fields: [barId], references: [id], onDelete: Cascade, onUpdate: Cascade)
  barId String
}

Typen av foo innehåller ['bar'][number]['baz'] i detta fall:

async function getFooById(id: Foo['id']) {
  return prisma.foo.findUnique({
    where: { id },
    include: { bar: { include: { baz: true } } },
  })
}

const foo = await getFooById('123')

if (foo !== null) {
  const baz = foo.bar[0].baz
}

Om jag försöker parametrera include, som jag förmodligen skriver fel, slutar det fungera:

import type { DefaultArgs } from '@prisma/client/runtime/library.js'

async function getFooById(
  id: Foo['id'],
  // this line is probably the cause for the error?
  { include }: { include: Prisma.FooInclude<DefaultArgs> } = { include: {} },
) {
  return prisma.foo.findUnique({
    where: { id },
    include,
  })
}

const foo = await getFooById('123', include: { bar: { include: { baz: true } } })

if (foo !== null) {
  // error: baz is not defined on foo.bar[0]
  const baz = foo.bar[0].baz
}

Jag känner att jag behöver specificera en annan argumenttyp eller eventuellt uttryckligen härleda returtypen baserat på argumentet - men hur?

En annan variant, som inte heller fungerade, inkluderar baz i den resulterande returtypen:

async function getFooById<ExtArgs extends Types.Extensions.InternalArgs = Types.Extensions.DefaultArgs>(
  id: Foo['id'],
  { include }: { include: Prisma.FooInclude<ExtArgs> } = { include: {} },
) {
  // …
}

Versionen av Prisma som används är 5.8.0, Typescript är 5.3.3.