如何获取Prisma Client带关联关系的完整类型,避免手动自定义
Prisma 关联类型自动获取方案
方案1:使用内置 GetPayload 工具类型(最常用)
Prisma 为每个模型自动生成了{模型名}GetPayload工具类型,直接传入你的include/select结构即可生成对应返回类型,无需手动拼接:
import type { Prisma } from '@prisma/client' // 只包含cars关联的用户类型 type UserWithCars = Prisma.usersGetPayload<{ include: { cars: true } }> // 所有关联字段都可选的完整用户类型,自动同步schema中定义的所有关联 type FullUserWithOptionalRelations = Prisma.usersGetPayload<{ include: { [K in keyof Prisma.usersInclude]?: true } }>
你可以直接把上述生成的类型作为函数参数类型使用,完全匹配查询返回的结构。
方案2:从查询语句直接提取类型(零额外定义)
如果查询参数是固定的,可以直接通过typeof提取返回类型,连额外的类型定义都省了:
import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient() // 定义查询参数,加as const确保类型不丢失 const userQuery = { include: { cars: true } } as const // 执行查询 async function getUsers() { return prisma.users.findMany(userQuery) } // 直接提取返回值类型作为参数类型 type UserQueryResult = Awaited<ReturnType<typeof getUsers>> // 函数直接使用提取的类型 function processUsers(users: UserQueryResult) { // 自动补全cars字段,类型完全正确 console.log(users[0].cars) }
方案3:通用Result工具类型(适配复杂动态查询)
如果是更复杂的动态查询场景,可以用更通用的Prisma.Result类型:
import type { Prisma } from '@prisma/client' // 定义查询参数约束,自动校验字段合法性 const queryArgs = Prisma.validator<Prisma.usersDefaultArgs>()({ include: { cars: { select: { id: true, brand: true } } } }) // 生成对应操作的返回类型,第三个参数为操作名:findMany/findFirst/create等 type CustomUserResult = Prisma.Result<Prisma.users, typeof queryArgs, 'findMany'>
所有上述类型都会在执行prisma generate时自动同步你的Schema变化,新增、修改关联都不需要手动调整类型定义。
内容的提问来源于stack exchange,提问作者dufaux
相关产品推荐
相关产品推荐

