如何为多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
相关产品推荐
相关产品推荐

