内容简介:在 GraphQL 中,接口(上例中,那么,在什么场景下应该使用接口?我们要理解,
在 GraphQL 中,接口( InterfaceTypeDefinition )也是一种命名字段集合,定义规则与对象类型极其相似,同样支持 字段名、类型、参数 三要素。 与 OOP 概念类似,GraphQL 中的接口只是对资源的抽象描述,必须被其他对象类型实现,才能正常使用。我们来看个例子:
interface NamedEntity { name: String } type User implements NamedEntity { id: ID! name: String } 复制代码
上例中, NamedEntity
即为接口; User
是实现了该接口的对象类型。注意, 实现类必须实现接口的所有字段,字段名、类型、参数都必须与接口匹配
。
GraphQL 支持多继承:
interface NamedEntity { name: String } interface Node { id: ID! } ''' 非法示例: 没有实现Node接口的id字段 ''' type User implements NamedEntity & Node { name: String } 复制代码
那么,在什么场景下应该使用接口?我们要理解, 接口是对资源的抽象描述 ,不一定完备、详尽,但往往能表述多类相似资源的共同特征,所以如果服务中存在一些具备共性的类型,而用户需要关注共同的这一部分,就应该使用接口。 比如,我们有三种类型的商品:饮料、图书、电器:
type Drinks { id: ID! name: String! price: Float! ''' 容量,单位为ml ''' capacity: Float! } type Book { id: ID! name: String! price: Float! ''' 作者 ''' author: [People] issn: String! } type ElectricalEquipment { id: ID! name: String! price: Float! ''' 生产商 ''' manufacturer: Company } 复制代码
上面三个商品对象有三个相似的属性: id
、 name
、 price
,是 商品
资源的不同类型。现在,我们需要实现根据名称搜索商品,如果接口功能,就必须使用近似的逻辑,在三种类型节点上,重复定义三次;如果未来我们增加更多公共查询逻辑,我们又得把逻辑重复三遍,这显然不是一个好的设计。这种情况下就适合使用接口,将三个公共字段抽取出来,再以接口类型对外暴露商品的聚合查询节点:
interface Item { id: ID! name: String! price: Float! } type Drinks implements Item{ ... } type Book implements Item{ ... } type ElectricalEquipment implements Item{ ... } type Query { ''' 商品列表,支持按商品名查询 ''' items(name: Sring): [Item] } 复制代码
而对于客户端来说,针对接口节点的查询,除了接口的属性外,也支持查询实现类的字段:
query { items(name: 'coka') { name ... on Drinks { capacity } } } 复制代码
代码片段 ... on Drinks { capacity }
,被称为
Inline Fragments
。
针对这段查询,引擎会帮助判断如果解析结果为 Drinks
类型,则返回 capacity
字段;如果是其他类型的商品,则不做进一步处理,不会返回 capacity
,也不报错。有兴趣的读者,可以到 GraphQL 接口示例代码
看看。
注意,GraphQL 引擎没有检测类型的能力,开发者必须为接口节点提供 resolveType
函数,以在运行时指定解析结果的类型!否则会报错:
Abstract type NamedEntity must resolve to an Object type at runtime for field Query.users with value { id: 1, name: \"foo\", age: 1, type: \"User\" }, received \"undefined\". Either the NamedEntity type should provide a \"resolveType\" function or each possible type should provide an \"isTypeOf\" function. 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- GO语言的接口类型
- golang中Any类型使用及空接口中类型查询
- Go语言基础⑨Go接口和嵌入类型
- .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
- golang的值类型,指针类型和引用类型&值传递&指针传递
- Scala 类型的类型(三)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
MATLAB高效编程技巧与应用
吴鹏 / 北京航空航天大学 / 2010-6 / 39.00元
《MATLAB高效编程技巧与应用:25个案例分析》是作者八年MATLAB使用经验的总结,精心设计的所有案例均来自于国内各大MATLAB技术论坛网友的切身需求,其中不少案例涉及的内容和求解方法在国内现已出版的MATLAB书籍中鲜有介绍。 《MATLAB高效编程技巧与应用:25个案例分析》首先针对MATLAB新版本特有的一些编程思想、高效的编程方法、新技术进行了较为详细的讨论,在此基础上,以大量......一起来看看 《MATLAB高效编程技巧与应用》 这本书的介绍吧!