在Prisma中创建资源时使用接口遇类型不兼容问题求助
解决Prisma Json列与自定义接口的类型兼容问题
方法1:直接类型断言(快速解决)
直接把你的IProductInfoAction对象断言为Prisma提供的InputJsonValue类型,让TypeScript认可类型匹配:
修改创建数据的代码:
import { InputJsonValue } from '@prisma/client'; const action: Action = await this.prisma.action.create({ data: { target: data.target, duration: data.duration, idle_time: data.idle_time, filters: data.filters, type: Type[data.type], score: 0, sessionId: data.sessionId, searched_term: data.searched_term, ...(data.product_info ? { product_info: data.product_info as InputJsonValue // 添加类型断言 } : {}) } });
方法2:扩展Prisma的JSON类型(全局生效)
如果不想每次都写断言,可以通过TypeScript模块扩展,让InputJsonValue自动包含你的自定义接口类型:
在项目根目录创建prisma-types.d.ts文件,写入以下内容:
import { InputJsonValue } from '@prisma/client'; import { IProductInfoAction } from './path-to-your-interface'; // 替换为你的接口实际路径 declare module '@prisma/client' { type InputJsonValue = | IProductInfoAction | string | number | boolean | null | InputJsonValue[] | { [key: string]: InputJsonValue }; }
之后你的IProductInfoAction会被TS自动识别为合法的InputJsonValue,无需再手动断言。
方法3:类型安全的转换函数(适合复杂场景)
如果需要严格校验输入结构,可写一个转换函数同时做类型检查:
import { InputJsonValue } from '@prisma/client'; import { IProductInfoAction } from './path-to-your-interface'; function toProductInfoInput(data: IProductInfoAction): InputJsonValue { // 可选:添加结构校验逻辑 if (typeof data.price !== 'number') { throw new Error('product_info.price 必须是数字类型'); } return data as InputJsonValue; }
创建数据时使用这个函数:
...(data.product_info ? { product_info: toProductInfoInput(data.product_info) } : {})
内容的提问来源于stack exchange,提问作者KyuolDa
相关产品推荐
相关产品推荐

