多项目场景下导入Prisma客户端如何避免类型覆盖?
解决多个Prisma客户端类型覆盖问题
当在同一个项目中导入多个Prisma客户端时,默认生成的类型(如PrismaClient、模型类型User等)会因命名重复导致TypeScript覆盖问题,以下是几种可行的解决方式:
方法1:自定义Prisma客户端的类型前缀与输出路径
通过修改两个Prisma项目的schema.prisma配置,让生成的客户端类型带有唯一前缀,从根源避免命名冲突:
配置prisma-project-1的schema.prisma
generator client { provider = "prisma-client-js" // 将生成的客户端输出到client项目的指定目录,方便导入 output = "../client-of-prisma-project-1-and-prisma-project-2/src/prisma-clients/project-1" previewFeatures = ["typePrefix"] // 为所有生成的类型添加前缀 typePrefix = "Project1_" }
配置prisma-project-2的schema.prisma
generator client { provider = "prisma-client-js" output = "../client-of-prisma-project-1-and-prisma-project-2/src/prisma-clients/project-2" previewFeatures = ["typePrefix"] typePrefix = "Project2_" }
配置完成后,分别在两个Prisma项目目录下运行npx prisma generate,生成带唯一前缀的客户端和类型。之后在client项目中导入时,类型会自动带有Project1_或Project2_前缀,不会再冲突:
import { PrismaClient as Project1PrismaClient, Project1_User } from './prisma-clients/project-1'; import { PrismaClient as Project2PrismaClient, Project2_User } from './prisma-clients/project-2';
方法2:导入时使用TypeScript别名重命名
如果不想修改Prisma的生成配置,可在导入阶段直接为客户端和类型重命名,手动避免冲突:
// 为两个客户端和同名类型分别设置别名 import { PrismaClient as Project1Client, User as Project1User } from '../prisma-project-1/node_modules/@prisma/client'; import { PrismaClient as Project2Client, User as Project2User } from '../prisma-project-2/node_modules/@prisma/client'; // 初始化独立的客户端实例 const project1 = new Project1Client(); const project2 = new Project2Client(); // 使用时通过别名明确区分类型 async function fetchAllUsers() { const usersFromProject1: Project1User[] = await project1.user.findMany(); const usersFromProject2: Project2User[] = await project2.user.findMany(); return { usersFromProject1, usersFromProject2 }; }
方法3:用Prisma客户端扩展封装实例
通过Prisma的Client Extensions功能为不同客户端添加标识,同时让TypeScript自动识别类型差异:
import { PrismaClient as Project1Client } from '../prisma-project-1/node_modules/@prisma/client'; import { PrismaClient as Project2Client } from '../prisma-project-2/node_modules/@prisma/client'; // 扩展客户端,添加唯一标识 const project1Client = new Project1Client().$extends({ name: 'project1-client', }); const project2Client = new Project2Client().$extends({ name: 'project2-client', }); // 此时TypeScript会正确区分两个客户端的类型,不会出现覆盖
内容的提问来源于stack exchange,提问作者Victordanny
相关产品推荐
相关产品推荐

