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.