Prisma2 update函数类型不匹配报错:NullableStringFieldUpdateOperationsInput问题
解决Prisma 2中更新可选字符串字段时的TypeScript类型错误
你碰到的这个类型错误是因为Prisma 2的嵌套更新语法有特定要求——对于可选的字符串字段(比如你的aboutMe、location这类String?类型),不能直接赋值字符串,必须用字段更新操作符(比如set)来包裹值。
问题根源
在Prisma的更新API里,当你嵌套更新关联模型(比如User下的Profile)时,每个字段的更新都要符合NullableStringFieldUpdateOperationsInput的结构。这个自动生成的类型要求你明确指定更新行为,哪怕是简单的赋值也得用操作符(比如set用来设置新值,unset用来清除值)。至于你找不到这个类型的定义,是因为它存在于Prisma自动生成的客户端类型文件里(在node_modules/@prisma/client目录下),你可以通过IDE的跳转功能(比如Ctrl+点击类型名)查看它的结构,大概是这样:
type NullableStringFieldUpdateOperationsInput = { set?: string | null }
修正后的代码
把你原来的字段赋值改成用set包裹的结构就行:
const updateUserProfileDetails = async ( inputValues, ctx: { session?: SessionContext } = {} ) => { const profile = await db.user.update({ where: { id: ctx.session!.userId }, data: { profile: { update: { aboutMe: { set: "this is a random message for about me." }, location: { set: "London, UK" }, profession: { set: "rubber duck" }, }, }, }, }); return profile; };
如果你的inputValues里包含这些字段的动态值,也可以这样动态构建更新对象:
const updateUserProfileDetails = async ( inputValues, ctx: { session?: SessionContext } = {} ) => { // 先构建要更新的Profile字段 const profileUpdates = {}; if (inputValues.aboutMe !== undefined) { profileUpdates.aboutMe = { set: inputValues.aboutMe }; } if (inputValues.location !== undefined) { profileUpdates.location = { set: inputValues.location }; } if (inputValues.profession !== undefined) { profileUpdates.profession = { set: inputValues.profession }; } const profile = await db.user.update({ where: { id: ctx.session!.userId }, data: { profile: { update: profileUpdates, }, }, }); return profile; };
这样就能通过TypeScript的类型检查,顺利完成Profile字段的更新了。
内容的提问来源于stack exchange,提问作者Kayote
相关产品推荐
相关产品推荐

