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

如何将含Prisma的TypeScript类封装为包供多项目复用?

封装TypeScript类为私有包并结合Prisma的解决方案

完全可行,不需要把Prisma schema放进你的私有包,核心思路是让你的类依赖调用方项目的Prisma客户端,而非自己维护schema。具体实现步骤如下:

1. 包的依赖配置

把@prisma/client设为peerDependencies,这样你的包不会自带Prisma客户端,而是复用调用方项目中已安装的版本,避免版本冲突。在package.json里添加:

{
  "peerDependencies": {
    "@prisma/client": ">=5.0.0"
  },
  "devDependencies": {
    "@prisma/client": ">=5.0.0",
    "typescript": "^5.0.0"
  }
}

devDependencies里加@prisma/client是为了本地开发时能获取类型提示。

2. 编写依赖Prisma类型的类

你的数据库管理类可以通过接收Prisma客户端实例、泛型或者特定模型类型来实现复用,举两个常见场景:

场景1:通用模型管理器(支持任意模型)

用泛型和动态模型名实现通用操作,类型安全且灵活:

// 私有包中的通用DbManager.ts
import type { PrismaClient, ModelName } from '@prisma/client';

export class DbManager<T> {
  private prisma: PrismaClient;
  private model: ModelName;

  constructor(prisma: PrismaClient, model: ModelName) {
    this.prisma = prisma;
    this.model = model;
  }

  async findById(id: string): Promise<T | null> {
    // 用类型断言处理动态模型的类型提示
    return (this.prisma[this.model] as any).findUnique({ where: { id } });
  }

  async create(data: Omit<T, 'id' | 'createdAt'>): Promise<T> {
    return (this.prisma[this.model] as any).create({ data });
  }
}

场景2:特定模型管理器(比如用户管理)

针对特定模型编写专用方法,类型提示更精准:

// 私有包中的UserManager.ts
import type { PrismaClient, User } from '@prisma/client';

export class UserManager {
  private prisma: PrismaClient;

  constructor(prisma: PrismaClient) {
    this.prisma = prisma;
  }

  async getUserByEmail(email: string): Promise<User | null> {
    return this.prisma.user.findUnique({ where: { email } });
  }

  async updateUser(id: string, data: Partial<User>): Promise<User> {
    return this.prisma.user.update({ where: { id }, data });
  }
}

3. 构建与发布私有包

  • 配置tsconfig.json,确保开启declaration: true,生成类型声明文件(.d.ts),让调用方有完整的TS提示。
  • 用tsc编译代码,把编译后的JS文件和声明文件打包发布到私有仓库(比如npm私有库、Verdaccio、GitHub Packages等)。

4. 调用方项目的使用方式

调用方只需要维护自己的Prisma schema,生成客户端后,直接传入实例到你的包的类中:

// 调用方项目代码
import { PrismaClient } from '@prisma/client';
import { UserManager, DbManager } from 'your-private-package';

const prisma = new PrismaClient();

// 使用特定模型管理器
const userManager = new UserManager(prisma);
const user = await userManager.getUserByEmail('user@example.com');

// 使用通用模型管理器
const postManager = new DbManager<Post>(prisma, 'post');
const post = await postManager.findById('post-id-123');

注意事项

  • 控制peerDependencies的版本范围,避免调用方使用的Prisma版本和你的包兼容问题。
  • 如果你的类依赖特定的模型字段,要和调用方约定好schema结构,或者用泛型让调用方传入自己的模型类型来保证类型安全。
  • 绝对不要在你的私有包中执行prisma generate或包含Prisma schema文件,完全依赖调用方的客户端实例即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:55:33