了解 GraphQL 联合类型

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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


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

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

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

【讨论】:

以上是关于了解 GraphQL 联合类型的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 联合和输入类型?

类型-graphql。字符串、布尔值和数字的联合类型失败

联合类型导致 graphql 订阅

使用 graphql-ruby 实现联合类型

GraphQL - 在联合内的不同类型中使用相同的字段名称

GraphQL - 联合类型给出错误 no class could be found for that type name