如何通过表名字符串获取对应Prisma的findMany查询参数?
通过表名获取Prisma对应表的FindMany参数类型
要实现仅通过表名获取对应表的查询参数并实现类型安全的函数,可以利用Prisma自动生成的类型系统来实现,具体步骤如下:
1. 利用Prisma生成的内置类型
Prisma运行npx prisma generate后,会为每个模型生成对应的FindManyArgs类型,比如模型user对应Prisma.UserFindManyArgs。我们可以通过类型映射将表名字符串关联到这些参数类型。
首先定义核心类型映射:
import { PrismaClient, Prisma } from '@prisma/client'; // 提取所有Prisma模型的名称 type ModelName = keyof PrismaClient; // 将表名映射到对应的FindMany参数类型 type ModelFindManyArgs<M extends ModelName> = Prisma[`${Capitalize<M>}FindManyArgs`];
2. 实现类型安全的通用函数
基于上面的类型,编写支持动态表名+对应参数类型的函数:
const prisma = new PrismaClient(); async function findManyByTableName<M extends ModelName>( tableName: M, args?: ModelFindManyArgs<M> ) { return await prisma[tableName].findMany(args); }
调用示例
当传入具体表名时,TypeScript会自动推断args的类型,提供精准的代码提示和类型校验:
// 传入user表,args自动匹配UserFindManyArgs类型 findManyByTableName('user', { where: { name: { contains: 'Alice' } }, select: { id: true, name: true } }); // 传入post表,args自动匹配PostFindManyArgs类型 findManyByTableName('post', { where: { published: true }, include: { author: true } });
3. 处理动态表名场景
如果表名是动态生成的字符串(非字面量),可以通过类型守卫来做合法性校验,再手动断言参数类型:
// 校验表名是否为合法的Prisma模型名 function isModelName(value: string): value is ModelName { return Object.keys(prisma).includes(value); } async function dynamicFindMany(tableName: string, args?: Record<string, unknown>) { if (!isModelName(tableName)) { throw new Error(`无效表名:${tableName}`); } // 手动断言参数类型 return await prisma[tableName].findMany(args as ModelFindManyArgs<typeof tableName>); }
内容的提问来源于stack exchange,提问作者Beatriz Helena
相关产品推荐
相关产品推荐

