在 GraphQL 中,Schema 是定义数据模型和查询语言的核心部分。随着 Schema 变得越来越复杂,我们需要使用一些组织 Schema 的技巧来确保它的可维护性和可扩展性。其中一种技术是使用抽象类型。
什么是抽象类型?
抽象类型是一种在 GraphQL 中定义类型的方式。相比于具体类型,抽象类型没有具体的字段,而是定义一组字段集合。抽象类型包括接口类型和联合类型。
接口类型
接口类型是一组字段集合的定义,它们没有具体实现。一个对象类型可以实现一个或多个接口类型,来表达该对象类型符合这些接口类型的字段集合定义。
例如,我们有一个 User 接口类型:
interface User { id: ID! name: String! }
然后我们有一个 Author 对象类型,它实现了 User 接口类型:
type Author implements User { id: ID! name: String! bio: String books: [Book!]! }
现在我们可以查询 Author 对象,同时查询 User 接口类型的字段:
query { author(id: "1") { id name } }
联合类型
联合类型是一组对象类型的定义,它们没有具体实现。一个对象可以属于一个或多个联合类型,来表达该对象是这些对象类型中的一种。
例如,我们有一个 Searchable 联合类型:
union Searchable = Book | Author | Publisher
然后我们有一个 Search 函数类型,它返回一个 Searchable 联合类型:
type Query { search(query: String!): [Searchable!]! }
现在我们可以查询 Search 函数,同时查询每个返回结果的具体类型:
-- -------------------- ---- ------- ----- - ------------- ---------- - --- -- ---- - ----- ----------- - --- -- ------ - ---- --- ----- - ----- - - --- -- --------- - ---- ----- - ----- ------ - ---- - - - - -
为什么使用抽象类型?
抽象类型有许多好处,其中一些是:
- 减少重复:使用接口和联合类型来组织 Schema,可以避免定义相同字段多次的情况。
- 灵活性:接口类型和联合类型提供了更高级别的抽象,使 Schema 更易扩展和修改。
- 表达多态:将泛化的字段集合定义为接口类型和联合类型,使得我们可以表达多态性,例如实现不同类型的对象之间的共享行为。
结论
在组织 GraphQL Schema 中的逻辑复杂性时,使用抽象类型是一个强大的工具。它们可以提供更高级别的抽象,避免重复,使 Schema 更易维护和扩展。通过使用接口类型和联合类型,我们可以表达多态性,使得我们的 Schema 更具有扩展性和灵活性。
参考资料
- GraphQL Interfaces and Unions: Abstract Types
- GraphQL Unions and Interfaces: Explained with examples
- How to use interfaces and unions in GraphQL schema design
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676fa727e9a7045d0d7533ac