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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:50:26