棱镜:类型“字符串”不可分配给类型“从不”

Posted

技术标签:

【中文标题】棱镜:类型“字符串”不可分配给类型“从不”【英文标题】:prisma: Type 'string' is not assignable to type 'never' 【发布时间】:2021-12-04 12:31:28 【问题描述】:

THIS IS THE ACTUAL ERROR

这是我的 DTO

export class CreateGradeDto 
  id: string;
  first_bimester?: number;
  second_bimester?: number;
  third_bimester?: number;
  fourth_bimester?: number;
  studentId: never;
  classId: string;
  createdAt: Date;
  updatedAt: Date;

这是我的棱镜模型

model Grades 
  id              String   @id @unique
  first_bimester  Float
  second_bimester Float
  third_bimester  Float
  fourth_bimester Float
  student         Student  @relation(fields: [studentId], references: [id])
  studentId       String   @unique
  class           Classes  @relation(fields: [classId], references: [id])
  classId         String   @unique
  createdAt       DateTime @default(now())
  updatedAt       DateTime @default(now())

这是学生模型

export class CreateStudentDto 
  id: string;
  name: string;
  cpf: string;
  createdAt: Date;
  updatedAt: Date;

(这个项目我用的是nestjs)

我不知道为什么我不能保存成绩,即使知道 ID 一直保存为字符串。我还检查了真正的 postgre 数据库,它们被保存为字符串。

有人可以帮帮我吗?

【问题讨论】:

你是在app中设置id而不是db吗? 是的,我使用 uuid lib 中的 v4 来创建 id 你应该有一个映射层,不要只是将dto传递给db(出于各种原因)。看起来 prisma 会根据模型模式为您生成类型,这就是类型不匹配的原因。有关示例,请参见 here。 我认为您需要创建该模型的新实例,将 dto 中的值映射到该实例,然后将该新实例传递给 create 方法。或者,如果您希望它快速而肮脏,您的 dto 可以扩展该类型。 我认为最好的做法是像这样直接发送 dto。谢谢你的帮助,我试试看。 【参考方案1】:

我最初无法弄清楚如何创建记录并将其与现有记录相关联。我遇到了和你一样的错误(好吧,number is not assignable to type never 因为我的 ID 是数字)。

然后我在这里找到了文档的相关部分:https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries/#connect-an-existing-record - 它不完全是前面和中心。您的情况下的语法类似于:

prisma.grade.create(
    data: 
      student:  connect:  id: 'your-student-id'  ,
      // ... rest of the grade data
    ,
  );

所以,是的,您需要进行某种映射以将 DTO 中的关系字段转换为上述语法。比如:

// Create a copy of the dto data without the foreign key fields. Using lodash here for brevity
const gradeData = _.omit(createGradeDto, ['studentId', 'classId']);

prisma.grade.create(
    data: 
      ...gradeData,
      student:  connect:  id: createGradeDto.studentId  ,
      class:  connect:  id: createGradeDto.classId  ,
    ,
  );

【讨论】:

无 lodash 版本:const studentId, classId, ...gradeData = createGradeDto

以上是关于棱镜:类型“字符串”不可分配给类型“从不”的主要内容,如果未能解决你的问题,请参考以下文章

反应类型错误“不可分配给'从不'类型的参数”

打字稿 - 字符串'不可分配给类型'FC

类型“字符串”不可分配给类型“日期”[关闭]

类型“字符串”不可分配给类型“图表类型”

打字稿类型'字符串| null' 不可分配给类型 'string'

键入'键:字符串; ' 不可分配给类型 'Product' Angular 7