【问题标题】:Understanding GraphQL Union types了解 GraphQL 联合类型
【发布时间】:2019-07-01 12:23:31
【问题描述】:

在此处尝试使用 GraphQL 中的联合类型时:https://graphql.github.io/learn/schema/#union-types 我遇到了以下问题:

我最初认为您在查询中指定的字段是要搜索文本的字段:“Millenium”,但事实并非如此,因为即使在删除名称后我仍在获取 Millenium Falcon 的数据Startship 类型的查询中的字段。

我又做了一个测试:R2-D2 的primaryFunction 是Astromech,如果你搜索Astromech 你什么也得不到,即使primaryFunction 被指定为Droid 类型。

【问题讨论】:

    标签: graphql


    【解决方案1】:

    请注意,名称仍会在 Starship 上指定,否则它不会显示在结果中,因为 Starship 不是角色!

    这仅仅意味着因为我们使用的是 Union 类型,给定属于 Union 的两个类型都具有 name 字段,您仍然需要为其内联片段中的每种类型请求 name 字段.省略Starship 片段的name,但将其包含在Character 中,意味着如果返回的类型是Character,则名称字段将存在,但不会出现在Starship 类型中。

    文档提到这一点是为了强调联合和接口之间的区别。 如果 SearchResult 是一个包含name 字段的接口并且Character 和Starship 实现了该接口,您可以改为执行以下操作:

    {
      search(text: "an") {
        name
        __typename
        ... on Human {
          height
        }
        ... on Droid {
          primaryFunction
        }
        ... on Starship {
          length
        }
      }
    }
    

    但由于联合不保证在它们的类型之间共享任何字段,所以联合不可以做到这一点。

    关于搜索,这不是 GraphQL 中的内容。这个特定的模式恰好在其Query 类型上有一个search 字段,并且该字段以特定方式解析。如果您正在创建服务器,则可以编写一个搜索字段,将请求的字段视为搜索条件的一部分。但这是一个实现细节,与 GraphQL 的一般工作方式无关。

    【讨论】:

      猜你喜欢
      • 2018-09-28
      • 2017-12-30
      • 2018-03-28
      • 2019-06-30
      • 2020-02-09
      • 2021-04-01
      • 2018-10-22
      • 2021-03-17
      相关资源
      最近更新 更多