如何为Prisma通用更新函数的model与params添加TypeScript类型?
为Prisma通用更新函数添加TypeScript类型安全
要给这个通用更新函数实现类型安全,核心是利用Prisma自带的类型系统,通过泛型绑定模型与对应的更新参数类型,具体有两种常见实现方式:
方式一:基于Prisma模型名称的精准绑定
直接借助Prisma提供的ModelName和Args类型,明确关联模型实例与更新参数的类型:
import { Prisma, PrismaClient } from '@prisma/client'; const updateModel = async <T extends Prisma.ModelName>( // 模型实例类型:对应PrismaClient的模型属性类型 model: PrismaClient[T], // 更新参数类型:绑定对应模型的update方法参数 params: Prisma.Args<T, 'update'> ) => { await model.update(params); };
这种方式类型提示最精准:当传入prisma.user作为model时,params会自动校验where条件(必须包含User模型的唯一标识字段)和data字段(只能是User模型允许更新的字段),编译阶段就能拦截错误。
方式二:基于方法签名的通用适配
如果不想依赖Prisma的模型名称枚举,也可以通过提取模型update方法的参数类型实现适配:
const updateModel = async <T extends { update: (args: any) => Promise<any> }>( model: T, // 提取update方法的第一个参数类型 params: Parameters<T['update']>[0] ) => { await model.update(params); };
这种方式更通用,只要对象有符合签名的update方法就能适配,同样能获得对应的类型校验能力。
效果示例
当调用updateModel(prisma.post, { where: { id: 1 }, data: { title: '新标题' } })时:
- 如果
where传入Post模型不存在的字段(比如nonExistentId),TypeScript会直接报错 - 如果
data传入不允许更新的字段(比如createdAt),也会触发编译错误
内容的提问来源于stack exchange,提问作者GoodBoyNeon
相关产品推荐
相关产品推荐

