了解 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 的primaryFunction
是Astromech
,如果你搜索Astromech
你什么也得不到,即使primaryFunction
被指定为Droid
类型。
【问题讨论】:
【参考方案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 的一般工作方式无关。
【讨论】:
以上是关于了解 GraphQL 联合类型的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL - 联合类型给出错误 no class could be found for that type name