如何为Prisma扩展的泛型gCreate函数指定正确返回类型?
解决Prisma Client Extensions中gCreate函数的返回类型问题
核心问题分析
你当前的gCreate函数用unknown作为返回数据类型,根源是泛型T的约束不明确,没和Prisma模型类型正确关联,导致TypeScript无法自动推导创建操作后的实体类型。
解决步骤
明确泛型约束
让T继承Prisma.Model,把泛型范围限定在Prisma的模型类型上,TypeScript就能识别模型的内置方法和类型定义。用Prisma内置工具类型获取返回类型
借助Prisma提供的Prisma.GetReturnType工具类型,直接解析this.create方法的返回类型,替代unknown。这个工具能自动匹配模型创建操作后的实体结构。简化类型推断逻辑
不需要手动指定泛型参数,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
相关产品推荐
相关产品推荐

