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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:23:16