2.6.4 类型条件

在学习接口和联合时,读者了解了如何让一个查询返回不止一种数据类型,可是不同的数据类型会包含不同的字段,如何在查询请求中针对不同的类型指定不同的字段呢?

需求 构建一个查询给服务器,查找书和新朋友。如果是书,需要书的id和书号(isbn)两个字段;如果是用户,需要id和其父亲名字(father{name})两个字段。

借用前面的书和新朋友中Resource的定义:union Resource=Book|User。

一个资源可以是一本书,也可以是个用户。allResource查询会返回一个资源的列表,用[Resource]表示。在列表中,具体的字段可以是本书,也可以是个用户,需要分别对待。具体代码如下:

和前面介绍的片段很像,仍然使用展开操作符“...”来展开字段。而且使用on这个关键字来表明这些字段要落实在哪个类型上。只有用户类型的数据,才会去索取father字段,同理,只有书类型的数据,才会去索取isbn字段。

使用… on TypeName{ field1, field2…}这样的表达,其实和使用片段十分类似,在GraphQL的标准中,称为内联片段。熟悉C++内联函数的读者,很容易想象到内联片段和普通片段的关系。

动动手:实测上述查询到底返回什么样的数据,然后试着使用上一节介绍的片段来重写这个查询。