NodeJS 属性'XXXX'的类型不兼容

pexxcrt2  于 2022-12-22  发布在  Node.js
关注(0)|答案(2)|浏览(195)

我现在使用nest js,用prisma作为orm。
我的问题发生在更新的时候,我有以下错误该错误是重复出现的所有实体有关系的另一个。只有在更新。:

TS2322: Type 'UpdateMarketDto' is not assignable to type '(Without<MarketsUpdateInput, MarketsUncheckedUpdateInput> & MarketsUncheckedUpdateInput) | (Without<...> & MarketsUpdateInput)'.   Type 'UpdateMarketDto' is not assignable to type 'Without<MarketsUncheckedUpdateInput, MarketsUpdateInput> & MarketsUpdateInput'.     Types of property 'univer' are incompatible.       Type 'CreateUniverDto | UpdateUniverDto' is not assignable to type 'UniversUpdateOneRequiredWithoutMarketsNestedInput'.         Type 'CreateUniverDto' has no properties in common with type 'UniversUpdateOneRequiredWithoutMarketsNestedInput'.

这是终点:

update(id: number, updateMarketDto: UpdateMarketDto) {
    return this.prisma.markets.update({
      where: { id },
      data: updateMarketDto,
    });
  }

这是创建的DTO:

export class CreateMarketDto {
  @ApiProperty({ example: 'Femme' })
  @IsString()
  @IsDefined()
  name: string;

  @ApiProperty({ example: 'textile.png' })
  @IsString()
  @IsOptional()
  icon: string;

  @ApiProperty({ example: 'true' })
  @IsBoolean()
  isActive: boolean;

  @ApiProperty({ example: '3' })
  @IsOptional()
  univer: CreateUniverDto | UpdateUniverDto;
}

这是更新后的DTO:

export class UpdateMarketDto extends PartialType(CreateMarketDto) {}

这是棱镜模型:

model Univers {
    id  Int    @id @default(autoincrement())
    name String
    icon String?
    isActive Boolean    @default(false)
    markets Markets[]
}

model Markets {
    id  Int    @id @default(autoincrement())
    name String
    icon String?
    isActive Boolean    @default(false)
    univer Univers @relation(fields:[univerId], references: [id])
    univerId Int
    categories Categories[]
}
r7s23pms

r7s23pms1#

您发布的错误看起来像是TypeScript错误,因此它实际上不会停止更新的发生,除非该错误停止了服务器的运行。
错误很明显-
第一个月
无论CreateUniverDto是什么类型,它都与Prisma的UniversUpdateOneRequiredWithoutMarketsNestedInput类型不兼容。如果您确信这两种类型确实相同,则可以将其强制转换为所需的类型:

update(id: number, updateMarketDto: UpdateMarketDto) {
  return this.prisma.markets.update({
    where: { id },  
    data: updateMarketDto as Prisma.UniversUpdateOneRequiredWithoutMarketsNestedInput,
  });
}

您应该检查Prisma.UniversUpdateOneRequiredWithoutMarketsNestedInput以确保其类型与您传递的updateMarketDto类型完全相同,否则更新将失败。
如果这两种类型不重叠,则需要手动将其提供给Prisma:

update(id: number, updateMarketDto: UpdateMarketDto) {
  return this.prisma.markets.update({
    where: { id },  
    data: {
      isActive: {
        set: updateMarketDto.isActive
      },
      name: {
        set: updateMarketDto.name
      },
      // add other fields here based on where they live in updateMarketDto
    }
  });
}
hmmo2u0o

hmmo2u0o2#

必须单独更新嵌套特性的数据,如下所示:

update(id: number, updateMarketDto: UpdateMarketDto) {
    return this.prisma.markets.update({
      where: { id },
      data: {
        ...updateMarketDto,
        univer:{
            update: {
                ...updateMarketDto.univer
            }
        }
        },
    });
  }

相关问题