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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:39:05