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

如何为Prisma扩展的泛型gCreate函数指定正确返回类型?

解决Prisma Client Extensions中gCreate函数的返回类型问题

核心问题分析

你当前的gCreate函数用unknown作为返回数据类型,根源是泛型T的约束不明确,没和Prisma模型类型正确关联,导致TypeScript无法自动推导创建操作后的实体类型。

解决步骤

  1. 明确泛型约束
    让T继承Prisma.Model,把泛型范围限定在Prisma的模型类型上,TypeScript就能识别模型的内置方法和类型定义。

  2. 用Prisma内置工具类型获取返回类型
    借助Prisma提供的Prisma.GetReturnType工具类型,直接解析this.create方法的返回类型,替代unknown。这个工具能自动匹配模型创建操作后的实体结构。

  3. 简化类型推断逻辑
    不需要手动指定泛型参数,TypeScript会根据调用gCreate的具体模型,自动推断T的实际类型。

修改后的代码

import { PrismaClient, type Prisma } from '@prisma/client'
import { logger } from './logger.service'
import { type IResponseObject, ResponseObject, type GenericResponseObject } from '../Entities'

export abstract class DatabaseHandler {
  static Instance: any

  constructor(
    protected unExtendedPrisma = new PrismaClient(),
    protected prisma = unExtendedPrisma.$extends({
      model: {
        $allModels: {
          async gCreate<T extends Prisma.Model>(
            this: T,
            args: Prisma.Args<T, 'create'>['data']
          ): Promise<GenericResponseObject<Prisma.GetReturnType<T['create'], { data: typeof args }>>> {
            try {
              const data = await this.create({ data: args })
              logger.debug({
                function: 'DatabaseHandler.create', data
              })
              return new ResponseObject(null, true, data)
            } catch (error) {
              logger.error({ function: 'DatabaseHandler.create', error })
              return new ResponseObject(error, false, null)
            }
          }
        }
      }
    })
  ) {
    if (DatabaseHandler.Instance !== undefined) return DatabaseHandler.Instance
    DatabaseHandler.Instance = this
    return DatabaseHandler.Instance
  }
}

额外优化点

  • 删掉this类型中冗余的{ create: (...args: any) => any },因为Prisma.Model已经包含了模型的所有操作方法定义。
  • 现在GenericResponseObject会自动填充模型创建后的正确类型,调用时无需手动指定泛型参数。

原理说明

  • Prisma.Model是所有Prisma模型的基类型,约束T后,TypeScript能精准识别模型的方法和数据结构。
  • Prisma.GetReturnType<Method, Args>用于获取特定方法在传入指定参数时的返回类型,这里传入T['create']和创建参数,就能得到精确的实体类型。

内容的提问来源于stack exchange,提问作者Adrian Abadán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:01:29