You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 04:09:03