我正在使用 NestJS、Prisma 和 TypeScript,在创建新记录时遇到与 Prisma 架构中的可选字段相关的意外行为。当对可选字段使用 TypeScript 扩展运算符时,似乎会出现此问题。
model Room {
id Int @id @default(autoincrement())
name String @db.VarChar()
roomType String @db.VarChar()
propertyId Int
surfaceArea Float
// ... other fields
}
在架构中,surfaceArea 是可选字段。
export class CreateRoomBodyDto {
// ... other fields
@IsNumber()
@IsOptional()
surfaceArea?: number;
}
服务方式: 当我在 Prisma 的 create 方法中使用来自 DTO 的 roomDetails 的展开运算符时,Prisma 似乎忽略了可选的 surfaceArea 字段:
public async createRoom(roomData: CreateRoomBodyDto): Promise<CreateRoomResponse> {
const { facilities, ...roomDetails } = roomData;
const room = await this.prismaClient.room.create({
data: { ...roomDetails }
});
// ... other logic
}
但是,当我在 create 方法中显式设置 surfaceArea: roomDetails.surfaceArea 时,它会按预期工作:
const room = await this.prismaClient.room.create({
data: { ...roomDetails, surfaceArea: roomDetails.surfaceArea },
});
问题: 使用 TypeScript 扩展运算符时,为什么 Prisma 无法识别或正确处理可选的 surfaceArea 字段?是否有与 TypeScript 的类型推断或 Prisma 对可选字段的处理相关的特定原因?
我正在尝试了解此行为的根本原因,以便更好地使用 Prisma 和 TypeScript 构建 NestJS 中的数据处理。
在为 roomDetails 变量赋值时为其指定一个类型。这样 prisma 就可以处理类型了。
这样做,prisma 将正确处理其余字段,您将获得很好的自动完成功能。