我正在使用prism和迁移模式后的nestjs。棱柱体,很多棱柱体类型都是自动生成的。我不确定使用生成类型的正确方法是什么,但我在服务文件和我自己的Dto控制器上使用生成的类型进行验证。然而,这会产生如下问题:
类型'number | IntFieldUpdateOperationsInput'不可分配"数量"类型。类型'IntFieldUpdateOperationsInput'不是可赋值给'number'类型。
IntFieldUpdateOperationsInput类型是由prisma为@default(autoincrement())自动生成的。然而,我认为我甚至不需要这个用例,因为只有数字类型的id就足够了。
export type IntFieldUpdateOperationsInput = {
set?: number
increment?: number
decrement?: number
multiply?: number
divide?: number
}
category.service.ts
...
update({ id, name }: Prisma.MainCategoryUncheckedUpdateInput) {
return this.prismaService.mainCategory.update({
where: { id },
data: { name },
});
}
...
category.controller.ts
...
@Patch(':id')
update(
@Param('id') id: string,
@Body() updateCategoryDto: UpdateCategoryDto,
) {
return this.categoryService.update({ id: +id, ...updateCategoryDto });
}
...
Schema.prisma
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(autoincrement())
email String @unique
username String @unique
password String
isAdmin Boolean
mainCategory MainCategory[]
projects Project[]
}
model TechStack {
id Int @id @default(autoincrement())
name String @unique
description String?
MainCategory MainCategory? @relation(fields: [mainCategoryId], references: [id])
mainCategoryId Int?
technologies Technology[]
}
model MainCategory {
id Int @id @default(autoincrement())
name String @unique
description String?
User User? @relation(fields: [userId], references: [id])
userId Int?
techStack TechStack[]
}
model Technology {
id Int @id @default(autoincrement())
name String @unique
description String?
status String
stars Int
TechStack TechStack? @relation(fields: [techStackId], references: [id])
techStackId Int?
projects ProjectTechnologies[]
}
model Project {
id Int @id @default(autoincrement())
name String @unique
description String?
link String
technologies ProjectTechnologies[]
User User? @relation(fields: [userId], references: [id])
userId Int?
}
model ProjectTechnologies {
project Project @relation(fields: [projectId], references: [id])
projectId Int // relation scalar field (used in the `@relation` attribute above)
technologies Technology @relation(fields: [technologyId], references: [id])
technologyId Int // relation scalar field (used in the `@relation` attribute above)
@@id([projectId, technologyId])
}
从显示的错误可以肯定,一个数字肯定是预期的。但是,有没有一种方法可以告诉typescript,它可以只得到一个数字,而不必编写额外的代码?或者以任何方式修改自动生成的文件?
您可以使用生成的MainCategoryUncheckedUpdateInput
定义创建一个新的类型,其中id
字段的类型为number
。
type customCategoryUpdateInput = Omit<Prisma.MainCategoryUncheckedUpdateInput, "id"> & {
id?: number; // redifining id to be of type number only
};
省略实用程序用于在重新定义MainCategoryUncheckedUpdateInput
之前先擦除id
的原始类型定义。现在你可以在你的服务文件中用customCategoryUpdateInput
代替Prisma.MainCategoryUncheckedUpdateInput
了。