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

如何为多Prisma客户端的通用工具函数定义基础类型?

问题解答

可以从@prisma/client导入通用的基础客户端类型,无需依赖具体应用生成的PrismaClient实例类型,也不用维护不可扩展的联合类型。以下是具体实现方案:

方案1:直接使用官方基础类型

所有应用生成的Prisma客户端都继承自@prisma/client提供的基础PrismaClient类,直接导入该类型即可实现通用适配:

import { PrismaClient } from '@prisma/client';

export async function truncateAllTables(prisma: PrismaClient) {
  const tablenames = await prisma.$queryRaw<Array<{ tablename: string }>>`SELECT tablename FROM pg_tables WHERE schemaname='public'`;

  const tables = tablenames
    .map(({ tablename }) => tablename)
    .filter(name => name !== '_prisma_migrations')
    .map(name => `"public"."${name}"`)
    .join(', ');

  console.warn(`truncating ${tables}`);

  try {
    await prisma.$executeRawUnsafe(`TRUNCATE TABLE ${tables} CASCADE;`);
  } catch (error) {
    console.log({ error });
  }
}

方案2:自定义极简通用类型(解耦依赖)

如果你的工具库不想强依赖@prisma/client包,可以只定义函数需要用到的核心方法签名,实现完全解耦的通用约束:

// 仅约束工具函数需要的核心方法
type BasePrismaClient = {
  $queryRaw<T = any>(query: TemplateStringsArray, ...values: any[]): Promise<T>;
  $executeRawUnsafe(query: string, ...values: any[]): Promise<number>;
};

export async function truncateAllTables(prisma: BasePrismaClient) {
  // 函数内容同上
}

方案说明

  • 官方PrismaClient类型适配所有生成的客户端实例,因为所有业务端的Prisma客户端都是该基础类的扩展实例
  • 自定义BasePrismaClient类型仅聚焦工具函数的实际需求,兼容性更强,适合跨项目复用的独立工具库

内容的提问来源于stack exchange,提问作者Rusty Rob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:05:20