了解GraphQL联合类型

时间:2019-02-07 11:33:34

标签: graphql

在这里使用GraphQL中的Union类型进行试验时:https://graphql.github.io/learn/schema/#union-types我遇到了以下情况:

enter image description here

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

我进行了另一项测试:R2-D2的primaryFunctionAstromech,即使您搜索Astromech,即使为{{ 1}}类型。

1 个答案:

答案 0 :(得分:0)

  

请注意,在“星际飞船”上仍要指定名称,因为如果“星际飞船”不是角色,则结果中不会显示该名称!

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

文档中提到这一点是为了突出联盟与接口之间的区别。 如果SearchResult是一个包含name字段的接口,并且CharacterStarship实现了该接口,则可以执行以下操作:

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

但是,由于联盟不保证其类型之间共享任何字段,因此使用联盟是不可能的。

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