首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Zod使对象属性变得灵活?

如何用Zod使对象属性变得灵活?
EN

Stack Overflow用户
提问于 2022-11-04 16:36:44
回答 1查看 43关注 0票数 1

新的打字稿,Zod & Trpc。

假设我对动物和植物都有一个模式。我希望将它们的所有公共属性存储在模式的“根”中,然后将更具体的属性放入名为custom的子对象中。(只是一个简化事情的虚构例子)

到目前为止我有这样的想法:

代码语言:javascript
复制
create: t.procedure
    .input(z.object({
      id: z.string(),
      type: z.string(), //can be "ANIMAL" or "PLANT"
      //all other common properties go here
      //...
      custom: z.object({ fur: z.string() }) //...if it's an animal, it will have "fur" here, if it's a plant something entirely different, like "seeds"
    }).nullish())

我不明白如何让这件事起作用,也不明白如何用zod来完成这件事。我研究了zods歧视联盟,但我似乎不完全理解语法是如何工作的?

EN

回答 1

Stack Overflow用户

发布于 2022-11-05 00:29:14

这是您何时使用discriminatedUnion的一个很好的例子。

例如:

代码语言:javascript
复制
const inputSchema = z.discriminatedUnion("type", [
  z.object({
    id: z.string(),
    type: z.literal('ANIMAL'),
    custom: z.object({ fur: z.string() }),
  }),
  z.object({
    id: z.string(),
    type: z.literal('PLANT'),
    custom: z.object({ seeds: z.number() }),
  })
]).nullish();

然后,您可以将该模式传递到input()。如果您有很多共享字段,您可以将这些字段存储在一个基本模式中,而不是将它们复制到每个分支中,然后将其放在一个merge中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74320261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档