如何提取Prisma Client扩展类型?拆分扩展时的类型定义难题
解决Prisma Client扩展拆分后的类型定义问题
方法1:从原始Prisma Client类型中提取对应模型的扩展类型
直接从_prismaClient实例的类型里提取query.company的类型,完美匹配原扩展的约束:
// companyExtensions.ts import { CompanyStatus, AccountLockedReason } from './path-to-enums'; import type { _prismaClient } from './prismaClient'; // 提取Prisma Client扩展参数中company模型的query扩展类型 type PrismaClientType = typeof _prismaClient; type CompanyQueryExtensions = NonNullable< Parameters<PrismaClientType['$extends']>[0]['query'] >['company']; export const companyExtensions: CompanyQueryExtensions = { update: async ({ args, query }) => { if (args.data?.status === CompanyStatus.DECLINED) { args.data.user = { update: { accountLocked: AccountLockedReason.COMPANY_DECLINED, }, }; } return query(args); }, };
方法2:使用Prisma内置的QueryExtension类型
利用Prisma提供的工具类型,直接指定目标模型和操作:
// companyExtensions.ts import { CompanyStatus, AccountLockedReason } from './path-to-enums'; import type { Prisma } from '@prisma/client'; import type { QueryExtension } from '@prisma/client/runtime/library'; // 定义Company模型update操作的扩展类型 type CompanyUpdateExtension = QueryExtension<'update', 'company'>; export const companyExtensions: { update: CompanyUpdateExtension } = { update: async ({ args, query }) => { if (args.data?.status === CompanyStatus.DECLINED) { args.data.user = { update: { accountLocked: AccountLockedReason.COMPANY_DECLINED, }, }; } return query(args); }, };
注意事项
- 避免循环导入问题:可将
_prismaClient的类型单独抽离到类型文件,或在prismaClient.ts中导出该类型 - 后续添加
create/delete等操作时,只需在companyExtensions对象中补充对应方法,类型会自动匹配约束
内容的提问来源于stack exchange,提问作者j_d
相关产品推荐
相关产品推荐

