Prisma+TypeScript+MongoDB模型数组Push操作类型错误求助
解决Prisma嵌套类型更新的类型不匹配问题
Prisma Schema片段
model Device { id String @id @default(auto()) @map("_id") @db.ObjectId modules Module[] sensorRecords SensorRecord[] plant Plant? @relation(fields: [plantId], references: [id]) plantId String? @db.ObjectId User User? @relation(fields: [userId], references: [id]) userId String? @db.ObjectId } type SensorRecord { sensorRecords IndividualSensorRecord } type IndividualSensorRecord { sensorUnit String sensorData Float? sensorState Boolean recordDate DateTime @default(now()) }
存在类型问题的代码
import SensorDataRecord from '../interfaces/SensorDataRecord' import prisma from '../utils/PrismaClient' export default async function createSensorDataRecord (deviceId: string, data: SensorDataRecord): Promise<void> { const records: any = [ // 需要修复此处类型 { sensorUnit: 'lm', sensorData: data.luminosity !== undefined ? data.luminosity : null, sensorState: data.luminosity !== undefined }, { sensorUnit: 'S/m', sensorData: data.electro_conductivity !== undefined ? data.electro_conductivity : null, sensorState: data.electro_conductivity !== undefined }, { sensorUnit: 'liters', sensorData: data.water_level !== undefined ? data.water_level : null, sensorState: data.water_level !== undefined }, { sensorUnit: 'pH', sensorData: data.ph !== undefined ? data.ph : null, sensorState: data.ph !== undefined } ] await prisma.device.update({ where: { id: deviceId }, data: { sensorRecords: { push: records } } }) }
触发的错误信息
尝试将records类型改为IndividualSensorRecord[]时,会抛出以下TypeScript错误:
Type '{ push: IndividualSensorRecord[]; }' is not assignable to type '(Without<SensorRecordListUpdateEnvelopeInput, SensorRecordCreateInput> & SensorRecordCreateInput) | (Without<...> & SensorRecordListUpdateEnvelopeInput) | (Without<...> & SensorRecordCreateInput[])'. Types of property 'push' are incompatible. Type 'IndividualSensorRecord[]' is not assignable to type 'Enumerable<SensorRecordCreateInput> | ((...items: SensorRecordCreateInput[]) => number) | undefined'. Type 'IndividualSensorRecord[]' is not assignable to type 'SensorRecordCreateInput[]'. Type 'IndividualSensorRecord' has no properties in common with type 'SensorRecordCreateInput'.ts(2322) index.d.ts(4771, 5): The expected type comes from property 'sensorRecords' which is declared here on type '(Without<DeviceUpdateInput, DeviceUncheckedUpdateInput> & DeviceUncheckedUpdateInput) | (Without<...> & DeviceUpdateInput)'
问题核心与解决方案
问题根源在于Schema的嵌套结构:Device关联的是SensorRecord[],而SensorRecord内部包含IndividualSensorRecord字段,但代码中直接构造了IndividualSensorRecord数组,和Prisma期望的类型不匹配。
方案1:修正数据结构适配现有Schema
导入Prisma自动生成的SensorRecordCreateInput类型,将每个传感器记录包裹在SensorRecord的结构中:
import { SensorRecordCreateInput } from '@prisma/client' import SensorDataRecord from '../interfaces/SensorDataRecord' import prisma from '../utils/PrismaClient' export default async function createSensorDataRecord (deviceId: string, data: SensorDataRecord): Promise<void> { const records: SensorRecordCreateInput[] = [ { sensorRecords: { sensorUnit: 'lm', sensorData: data.luminosity !== undefined ? data.luminosity : null, sensorState: data.luminosity !== undefined } }, { sensorRecords: { sensorUnit: 'S/m', sensorData: data.electro_conductivity !== undefined ? data.electro_conductivity : null, sensorState: data.electro_conductivity !== undefined } }, { sensorRecords: { sensorUnit: 'liters', sensorData: data.water_level !== undefined ? data.water_level : null, sensorState: data.water_level !== undefined } }, { sensorRecords: { sensorUnit: 'pH', sensorData: data.ph !== undefined ? data.ph : null, sensorState: data.ph !== undefined } } ] await prisma.device.update({ where: { id: deviceId }, data: { sensorRecords: { push: records } } }) }
方案2:简化Schema结构(更贴合业务逻辑时可选)
如果业务中SensorRecord的嵌套结构没有实际意义,可直接让Device关联IndividualSensorRecord[]:
model Device { // 保留原有的其他字段 id String @id @default(auto()) @map("_id") @db.ObjectId modules Module[] plant Plant? @relation(fields: [plantId], references: [id]) plantId String? @db.ObjectId User User? @relation(fields: [userId], references: [id]) userId String? @db.ObjectId // 修改此处,直接关联IndividualSensorRecord sensorRecords IndividualSensorRecord[] } type IndividualSensorRecord { sensorUnit String sensorData Float? sensorState Boolean recordDate DateTime @default(now()) }
修改后,代码中最初的IndividualSensorRecord[]类型就能直接使用,无需额外包裹。
内容的提问来源于stack exchange,提问作者Alexandre Schaffner
相关产品推荐
相关产品推荐

