NestJS集成Prisma出现Type 'number'无法赋值给'never'类型错误求助
解决NestJS + Prisma中Film创建时categoryId类型不兼容问题
错误原因分析
你遇到的number无法赋值给never的错误,本质是你的CreateFilmDto结构和Prisma自动生成的FilmCreateInput类型不匹配。
Prisma根据Schema生成输入类型时,对于关联字段(比如Film和Category的关联),默认的FilmCreateInput要求通过category对象建立关联(如{ connect: { id: 1 } }),而非直接传入categoryId。当你尝试把带categoryId的DTO直接传给prisma.film.create()时,TypeScript会检测到冲突:FilmCreateInput不包含categoryId字段,类型交叉操作后该字段被标记为never。
解决方案
方案1:在Service层转换DTO为Prisma兼容格式
保持CreateFilmDto不变,在创建Film的Service方法中,将categoryId转换为Prisma要求的关联语法:
// film.service.ts import { Injectable } from '@nestjs/common'; import { PrismaService } from './prisma.service'; import { CreateFilmDto } from './dto/create-film.dto'; @Injectable() export class FilmService { constructor(private prisma: PrismaService) {} async create(createFilmDto: CreateFilmDto) { const { categoryId, ...restFields } = createFilmDto; return this.prisma.film.create({ data: { ...restFields, category: { connect: { id: categoryId }, }, }, }); } }
方案2:使用Prisma的Unchecked输入类型
Prisma提供了FilmUncheckedCreateInput类型,允许直接传入关联字段的ID(如categoryId),无需通过关联对象。你可以在Service中指定该类型:
// film.service.ts async create(createFilmDto: CreateFilmDto) { return this.prisma.film.create({ data: createFilmDto as Prisma.FilmUncheckedCreateInput, }); }
注意:使用Unchecked类型会绕过Prisma的部分关联校验,需确保你的IsValidCategoryId自定义校验器能正常验证categoryId对应的Category存在。
方案3:重新生成Prisma客户端
若以上方法无效,可能是Prisma客户端未正确更新,执行以下命令重新生成:
npx prisma generate
额外检查点
- 确认
IsValidCategoryId校验器逻辑正常,能验证传入的categoryId对应数据库中存在的Category。 - 再次核对Prisma Schema中
Film与Category的关联定义,当前Schema的@relation注解字段和引用匹配无误,若有修改需重新生成客户端。
内容的提问来源于stack exchange,提问作者Abduhodi Tursunboyev
相关产品推荐
相关产品推荐

