在 GraphQL Schema 中,我们可以使用 Union 和 Interface 来定义一组相关的类型。它们的主要区别在于它们的操作和使用上不同。
Interface
Interface 是一种用来定义一组相似类型的抽象类型。我们可以通过定义一个 Interface 来描述一组具有相似属性结构的类型,例如下面这个例子:
// javascriptcn.com 代码示例 interface Person { name: String! age: Int! } type Student implements Person { name: String! age: Int! school: String! } type Teacher implements Person { name: String! age: Int! teachingSubjects: [String!]! }
在这个例子中,我们定义了一个 Person
接口来描述具有 name
和 age
属性的类型。然后我们分别使用 type
定义了两个实现 Person
接口的类型 Student
和 Teacher
。这样做的好处是我们可以写一个查询接口来查询所有实现了 Person
接口的类型,例如:
type Query { people: [Person!]! }
以上查询语句将返回所有实现了 Person
接口的类型,因为我们只需要访问 name
和 age
属性即可。
Union
Union 也是一种用来定义一组相似类型的类型,但它与 Interface 的不同在于 Union 可以将不同类型的值归为一组类型中并作为返回值,例如下面这个例子:
// javascriptcn.com 代码示例 type Book { title: String! author: Author! } type Author { name: String! age: Int! } union SearchResult = Book | Author
在这个例子中,我们将 Book
和 Author
类型归为一组类型中并定义为一个 SearchResult
类型。这样我们可以使用以下查询语句搜索 Book
或 Author
:
type Query { search(query: String!): [SearchResult!]! }
以上查询语句将返回一个由 Book
或 Author
类型组成的数组,具体是哪种类型可以通过查询结果中的 __typename
字段来判断。
总结
Interface 和 Union 都是用来定义一组相似类型的类型,但在使用上不同,Interface 用于描述具有相似结构的类型,而 Union 则是将不同类型的值归为一类。在实际应用中,我们需要根据具体的业务场景来选择使用哪种类型来定义。
示例代码
以下是以上介绍所涉及到的全部代码:
// javascriptcn.com 代码示例 interface Person { name: String! age: Int! } type Student implements Person { name: String! age: Int! school: String! } type Teacher implements Person { name: String! age: Int! teachingSubjects: [String!]! } type Book { title: String! author: Author! } type Author { name: String! age: Int! } union SearchResult = Book | Author type Query { people: [Person!]! search(query: String!): [SearchResult!]! }
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654b1bc77d4982a6eb513493