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

使用Prisma实现Repository模式时遭遇类型继承错误

Prisma 实现 Repository 模式的类型推导问题

我用 Prisma 写 Repository 模式时踩了个类型坑:调用带关联查询的方法时,返回类型没自动包含关联的字段。

代码示例

class PostModel {
  static async findMany(obj?: Prisma.PostFindManyArgs) {
    return await db.post.findMany(obj);
  }
}

// 注:类里定义的是 findMany,这里调用的是 findUnique,应为笔误,实际是想实现对应查询方法
await PostModel.findUnique({
  where: {
    id: params.id,
  },
  include: {
    author: true,
  }
})

实际返回类型

Post | null

预期返回类型

Post & {author: Author} | null

我试着加泛型解决,但写法不对:

static async findMany<T extends Prisma.PostFindManyArgs>(
  obj: T
): Promise<Prisma.PrismaPromise<Prisma.Result<typeof db.post, T,'findMany'>>> {
  return await db.post.findMany(obj);
}

正确解决方法

要让 Repository 的方法正确推导关联查询的返回类型,得用对 Prisma 的类型工具,调整泛型和返回值定义:

以 findUnique 为例(先把类里的方法补对):

class PostModel {
  static async findUnique<T extends Prisma.PostFindUniqueArgs>(
    args: T
  ): Promise<Prisma.Result<typeof db.post, T, 'findUnique'>> {
    return db.post.findUnique(args);
  }
}

如果是 findMany,正确写法是:

class PostModel {
  static async findMany<T extends Prisma.PostFindManyArgs>(
    args?: T
  ): Promise<Prisma.Result<typeof db.post, T, 'findMany'>> {
    return db.post.findMany(args);
  }
}

几点关键:

  • 泛型 T 要继承对应操作的 Prisma 参数类型,比如查询单个用 PostFindUniqueArgs,查列表用 PostFindManyArgs
  • 返回类型直接用 Prisma.Result,不用嵌套 Prisma.PrismaPromise —— 因为 await 会自动解析 Promise,嵌套反而会导致类型不对
  • Prisma 的 Result 工具会根据你传入的参数(比如 include)自动推导带关联字段的返回类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:40:07