如何告诉typescript给定的输入将具有预期类型的子集



我正在使用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了。

最新更新