nell04 2024-12-19 18:07 采纳率: 9.1%
浏览 4

tRPC是否支持部分参数的验证以确保更新只传入必要的参数?

tRPC 一般是使用z.object()来进行参数验证的。

举例:

interface Proj {
  id: number,
  projName: string,
  desc?: string
}


export const projUpdate = publicProcedure.input(
  z.object({
    id: z.number(),
    projName: z.string(),
    desc: z.string()
  })
).mutation(({ input: {id, projName, desc} }) => {
  dataBase.getRepository(Proj).createQueryBuilder('proj').where('proj.id = :id', {id: id}).update({
    projName: projName,
    desc: desc
  })
})

现在有一个需求问题:
1、请问是否是可以进行类型Proj验证呢?因为更新实例Proj,我们一般传输部分参数为:Partial<Proj>即可,但是这里是:
全验证:

z.object({
    id: z.number(),
    projName: z.string(),
    desc: z.string()
  })

2、表现:使用时候报错:

export const addProj = async(proj: Proj) => {
  return await trpc.projCreate.mutate(proj)  // 这里报错
}

img

请问是否可以进行Partial 可选参数传入更新呢?

  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    关于你的问题,我会尽量详细解答。在 tRPC 中,你确实可以使用 z.object() 进行参数验证,并且你可以使用 TypeScript 的 Partial 类型来处理可选参数。但是,根据你的问题,看起来你在使用 tRPC 和 TypeScript 时遇到了一些类型兼容性的问题。

    首先,对于你的第一个问题,你可以使用 Partial 类型来验证部分参数。Partial 类型允许你传递 Proj 接口的一个子集作为参数,其中的可选属性可以是未定义的。这可以用来处理只需要更新部分字段的情况。然而,由于 tRPC 需要明确知道每个参数的预期类型,你需要手动指定这些类型,而不是直接使用 Partial。你可能需要为每个参数单独定义验证器,或者创建一个更通用的验证器来处理这种情况。这可能涉及到一些额外的编程工作,但这是类型安全和代码可读性的代价。

    对于你的第二个问题,报错信息表明类型不兼容。这可能是因为你在调用 trpc.projCreate.mutate 方法时传递的参数的类型与该方法期望的参数类型不匹配。具体来说,问题出在属性 "desc" 的类型上,它期望的是一个 string 类型,但你传递的可能是 string 或 undefined。你可以尝试将你的 proj 参数更改为 Partial 类型来解决这个问题。这样,如果某些属性未定义,它们将被视为可选的。请注意,这取决于你的 tRPC 端点的定义是否允许这种类型。如果不能解决问题,你可能需要调整你的 tRPC 端点的定义以接受这种类型。

    总的来说,你可以使用 Partial 类型来处理可选参数,但你需要确保你的代码和 tRPC 端点的定义都正确地处理了这种情况。此外,你可能需要手动定义更复杂的验证器来处理部分参数的情况。希望这些信息对你有所帮助!如果你还有其他问题或需要进一步的澄清,请告诉我。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月19日