如何处理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
相关产品推荐
相关产品推荐

