You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:21:06