Prisma创建对象时出现类型无法赋值为never错误求助
解决Prisma创建嵌套数据时的TypeScript错误
问题根源分析
你遇到的Type '...' is not assignable to type 'never'错误,核心来自三个问题:
1. 数据库关系配置错误
你的Schema中,ActivityResource和Module的关联字段配置完全错误:
- 两个模型都用自身的
id主键作为外键关联父表,导致主键与外键冲突,Prisma无法正确推断关系类型,最终抛出never类型异常。 - 关联字段的定义不符合Prisma的关系规范。
2. Enum命名冲突
type是TypeScript的保留关键字,用它作为enum名称会引发类型解析异常。
3. 嵌套数据创建语法错误
type是单个枚举值字段,你却使用了数组set操作,与字段类型不匹配。
修正后的Prisma Schema
先修复Schema的核心问题:
model Course { id String @id @default(cuid()) courseName String modules Module[] } model ActivityResource { id String @id @unique @default(cuid()) // 补充默认值,创建时无需手动传id type ResourceType // 重命名enum避免关键字冲突 name String url String moduleId String // 新增独立外键字段 module Module @relation(fields: [moduleId], references: [id], onDelete: Cascade) // 修正关联配置 } model Module { id String @id @default(cuid()) moduleName String order Int activityResources ActivityResource[] // 改用小驼峰命名,符合Prisma惯例 courseId String // 新增独立外键字段 course Course @relation(fields: [courseId], references: [id], onDelete: Cascade) // 修正关联配置 } enum ResourceType { // 重命名enum EXAMPLE CHALLENGE CODING }
修正后的创建数据代码
调整嵌套创建语法,匹配修正后的Schema:
const java = await prisma.course.create({ data: { courseName: "java", modules: { create: [ { moduleName: "Encapsulation", order: 1, activityResources: { // 对应Schema中的小驼峰命名 create: [{ type: 'EXAMPLE', // 直接赋值枚举值,无需set操作 name: "ActivityName", url: "someurl", }] } }, ], }, }, include: { // 可选:关联查询返回嵌套数据,验证创建结果 modules: { include: { activityResources: true } } } });
关键说明
- 外键必须是独立字段,不能与主键复用,Prisma通过
@relation注解关联外键与父表主键。 - 避免使用TypeScript/JavaScript保留关键字作为模型、字段或enum名称。
- 嵌套创建时,字段名必须与Schema定义完全一致(注意大小写和驼峰命名)。
- 枚举类型直接赋值枚举值字符串即可,
set操作仅用于更新数组类型字段。
内容的提问来源于stack exchange,提问作者Mathias Fossum
相关产品推荐
相关产品推荐

