NestJS搭配Prisma时如何告知TypeScript入参为预期类型的子集
报错根因
你遇到的类型报错本质是入参类型误用导致的:
Prisma.MainCategoryUncheckedUpdateInput是Prisma专为update操作的data字段设计的类型,带Unchecked前缀的更新类型默认支持数值字段的原子操作(自增、自减、乘除等),所以id字段会被推导为number | IntFieldUpdateOperationsInput联合类型- 但你实际把id放到了update操作的
where参数中,where里的id仅接受纯number类型,因此出现类型不匹配。
解决方案(无需修改Prisma自动生成文件、无需额外编写自定义类型)
方案1:添加类型断言(改动最小,仅需修改1行代码)
业务上已经确定入参id为纯number,直接在使用id的地方加类型断言即可:
// category.service.ts update({ id, name }: Prisma.MainCategoryUncheckedUpdateInput) { return this.prismaService.mainCategory.update({ where: { id: id as number }, // 仅新增as number断言 data: { name }, }); }
方案2:替换入参类型(更规范,无类型隐患)
直接复用Prisma自动生成的类型组合作为入参类型,不需要手写额外自定义类型:
// category.service.ts // 组合where唯一查询类型 + 可更新字段类型,id自动推导为纯number update({ id, name }: Prisma.MainCategoryWhereUniqueInput & Pick<Prisma.MainCategoryUpdateInput, 'name'>) { return this.prismaService.mainCategory.update({ where: { id }, data: { name }, }); }
后续如果要新增可更新字段,只需在Pick的泛型参数中追加对应字段名即可,完全复用Prisma自动生成的类型规则。
方案3:拆分入参(逻辑更清晰,推荐)
id是查询条件,更新字段是业务数据,二者本来就不属于同一逻辑层,拆分后不需要任何类型适配:
// category.service.ts update(id: number, data: Prisma.MainCategoryUpdateInput) { return this.prismaService.mainCategory.update({ where: { id }, data, }); } // controller层调用同步调整即可 @Patch(':id') update( @Param('id') id: string, @Body() updateCategoryDto: UpdateCategoryDto, ) { return this.categoryService.update(+id, updateCategoryDto); }
内容的提问来源于stack exchange,提问作者Shiladitya Thakur
相关产品推荐
相关产品推荐

