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

如何处理Prisma与API数据间缺失的ID字段问题

关于TypeScript复用Prisma类型及数据插入的问题

背景代码

获取API数据的函数:

async function getApiData() {
  const promises = [];
  for (let i = 0; i < PAGE_COUNT; i++) {
    const apiData = fetch(...);
    promises.push(apiData); // 补充原代码遗漏的push操作
  }
  const apiData = await Promise.all(promises);
  return apiData;
}

API返回的单条数据结构示例:

const exampleData = { name: 'john', lastName: 'doe' };

Prisma模型定义:

model Person {
  id       Int    @id @default(autoincrement())
  name     String
  lastName String
}

导入的Prisma类型Person包含id字段,直接复用会触发类型错误:

Property 'id' is missing in type '{name, lastName}' but required in type 'Person'

疑问解答

1. 复用Prisma类型定义API返回数据类型

用TypeScript内置的Omit工具类型,直接排除Person类型中的id字段即可,无需重复定义新接口:

import { Person } from '@/prisma/client';

// 排除id字段,得到API返回数据的类型
type ApiPerson = Omit<Person, 'id'>;

// 给getApiData指定返回类型
async function getApiData(): Promise<ApiPerson[]> {
  const promises = [];
  for (let i = 0; i < PAGE_COUNT; i++) {
    const response = await fetch(...);
    const data = await response.json();
    promises.push(data);
  }
  return Promise.all(promises);
}

Omit<T, K>的作用是从类型T中移除指定的属性K,完美适配你的场景。

2. TypeScript下向Prisma插入数据的类型处理

Prisma会自动为每个模型生成对应的创建输入类型,比如针对Person模型的Prisma.PersonCreateInput,这个类型中id是可选的(因为数据库会自动生成自增ID),完全匹配你插入时无需传id的需求。

直接使用这个类型即可,示例:

import { PrismaClient, Prisma } from '@prisma/client';

const prisma = new PrismaClient();

async function insertPersons(apiData: Prisma.PersonCreateInput[]) {
  for (const person of apiData) {
    await prisma.person.create({
      data: person
    });
  }
}

你也可以复用之前定义的ApiPerson类型,因为ApiPerson和PersonCreateInput的结构一致(都不含id),直接传入ApiPerson类型的数据也能通过类型校验。


内容的提问来源于stack exchange,提问作者713sean

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:37:21