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

如何使Prisma模型作为泛型实现BaseRepository并解决CRUD方法类型错误

Prisma 动态模型CRUD的TypeScript类型错误解决方法

问题场景

想要通过传入模型名称实现所有数据表的CRUD操作,编写了如下基础仓库类代码:

class BaseRepository{
  db = prisma
  async findAll(modelName: "user" | "post"){
    return await this.prisma[modelName].findMany()
  }
}

但调用findMany、findUnique等CRUD方法时都会触发TypeScript错误,需要解决该问题。

解决方案

TypeScript报错的核心原因是无法确定this.prisma[modelName]的具体类型——Prisma客户端的每个模型都有独立的类型定义,动态取值时TypeScript无法自动推断对应的CRUD方法类型。以下是几种可行的解决方式:

1. 利用Prisma内置类型实现泛型约束

借助Prisma生成的内置类型,通过泛型约束让TypeScript准确识别模型对应的操作方法:

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

const prisma = new PrismaClient();

class BaseRepository {
  private prisma = prisma;

  // 查询所有数据
  async findAll<T extends Prisma.ModelName>(modelName: T) {
    const model = this.prisma[modelName] as PrismaClient[T];
    return await model.findMany();
  }

  // 根据唯一条件查询单条数据
  async findUnique<T extends Prisma.ModelName>(
    modelName: T,
    where: Prisma.Args<PrismaClient[T], 'findUnique'>['where']
  ) {
    const model = this.prisma[modelName] as PrismaClient[T];
    return await model.findUnique({ where });
  }
}

这里Prisma.ModelName包含了所有数据库模型的名称联合类型,泛型T约束传入的模型名后,PrismaClient[T]能精准定位到对应模型的客户端操作类型,解决类型推断问题。

2. 手动定义模型-操作类型映射表

如果需要更直观的类型控制,可以手动创建模型到其操作类型的映射:

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

const prisma = new PrismaClient();

// 定义模型与对应操作类型的映射
type ModelOperationMap = {
  user: typeof prisma.user;
  post: typeof prisma.post;
};

class BaseRepository {
  private prisma = prisma;

  async findAll<K extends keyof ModelOperationMap>(modelName: K) {
    const model = this.prisma[modelName] as ModelOperationMap[K];
    return await model.findMany();
  }
}

这种方式适合模型数量较少的场景,TypeScript能明确识别每个模型对应的CRUD方法,避免泛型带来的复杂度。

3. 原生SQL兜底(不推荐)

如果对类型安全要求不高,也可以使用Prisma的原生SQL查询,但会失去Prisma的类型校验优势:

async findAll(modelName: "user" | "post") {
  return await this.prisma.$queryRaw`SELECT * FROM ${Prisma.raw(modelName)}`;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:37:03