TypeScript中Prisma.field.create无法直接传对象的类型安全解决方法
解决Prisma与自定义类型不兼容的类型安全调用问题
核心问题分析
你遇到的问题本质是手动定义的FieldProps与Prisma自动生成的数据库类型不匹配,同时存在代码写法错误,导致类型校验失败:
- 自定义
FieldProps的类型与schema定义不一致(比如id是string而非number,latitude/longitude是Decimal而非number) - 未导入Prisma自动生成的枚举和类型
prisma.field.create的data参数写法错误,嵌套了多余的field对象- 不知道如何引用Prisma自动生成的类型
解决方案步骤
1. 确保Prisma类型已生成
首先执行命令生成最新的Prisma客户端类型:
npx prisma generate
Prisma会根据你的schema.prisma自动生成类型定义,存放在node_modules/.prisma/client目录下,可直接从@prisma/client导入使用。
2. 导入Prisma生成的类型与枚举
从@prisma/client导入所需的枚举、类型和客户端实例,替代手动定义的不一致类型:
import { PrismaClient, AreaUnit, Field as PrismaField, FieldCreateInput } from '@prisma/client'; // 初始化Prisma客户端 const prisma = new PrismaClient();
3. 复用Prisma类型定义FieldProps
无需手动编写FieldProps,直接复用Prisma生成的FieldCreateInput,并通过Omit去掉自动生成的id字段:
// 去掉自动生成的id字段,只保留需要手动传入的属性 type FieldProps = Omit<FieldCreateInput, 'id'>;
如果一定要保留自定义类型,需严格对齐schema定义:
type FieldProps = { name: string; area: number; unit: AreaUnit; latitude?: string | number; // Prisma Decimal支持数字或字符串输入 longitude?: string | number; description?: string; };
4. 修正create方法的类型安全调用
调整data参数的写法,直接传入field对象(而非嵌套{ field }),并使用Prisma生成的PrismaField作为返回类型:
export class Field { static async create(field: FieldProps): Promise<PrismaField> { const createdField = await prisma.field.create({ data: field, }); return createdField; } }
额外说明
- Prisma生成的类型会严格对齐你的
schema.prisma,手动定义类型很容易出现不一致,推荐直接复用Prisma的类型 - 如果需要对返回的字段做过滤,可以在
create方法中添加select或include参数,同时Prisma会自动推导对应的返回类型 - 若要避免类名冲突,可将自定义的
Field类重命名为FieldService之类的名称,与Prisma生成的Field类型区分开
内容的提问来源于stack exchange,提问作者0szi
相关产品推荐
相关产品推荐

