GraphQL 教程:如何使用 Union 类型

GraphQL 是一个用于 API 设计的查询语言和运行时环境,它提供一种高效、强类型、可理解的方式来描述和查询数据。在 GraphQL 中,Union 类型可以将不同类型的对象结合在一起,使得查询和处理不同的类型更加方便。本篇文章将详细讲解 GraphQL 的 Union 类型,包括定义、使用和示例。

什么是 Union 类型?

在 GraphQL 中,Union 类型是一种由多个对象类型组成的类型,用于表示不同类型的对象集合。这些对象可以共享相同的字段,并分别具有它们自己独特的字段。Union 类型对于查询返回多个类型的集合非常有用,如搜索页的搜索结果展示。

如何定义 Union 类型?

在 GraphQL 中,可以通过在 schema 中定义 Union 类型来进行定义。以下是定义 Union 类型的示例:

union SearchResult = Product | Article | User

上述定义声明了 SearchResult 为一个 Union 类型,它可以包含 Product、Article 和 User 三个类型。这表示 SearchResult 可以包含一个 Product 对象、一个 Article 对象或一个 User 对象。这种定义方式使得查询结果存在了多种可能性,为客户端提供了更多的灵活性。

如何使用 Union 类型?

使用 Union 类型是非常简单的,客户端只需要声明想要查询的字段,GraphQL 会自动返回结果。例如:

{
  search(query: "GraphQL") {
    ... on Product {
      name
      price
    }
    ... on Article {
      title
      author {
        name
      }
    }
    ... on User {
      name
      age
    }
  }
}

上述查询语句会返回 search 的结果,如果结果是 Product 类型,会返回 name 和 price 字段;如果结果是 Article 类型,会返回 title 和 author 字段;如果结果是 User 类型,会返回 name 和 age 字段。这种查询方式可以同时返回不同类型的对象,提高了查询的效率和灵活性。

Union 类型的示例

为了更好地理解 Union 类型的使用,下面通过一个示例来演示如何使用 Union 类型。

首先,我们在 schema 中定义了一个 Union 类型 SearchResult:

union SearchResult = Product | Article | User

然后,我们定义了三个对象类型:Product、Article 和 User,它们之间具有不同的字段。

type Product {
  id: ID!
  name: String!
  price: Float!
}

type Article {
  id: ID!
  title: String!
  author: User!
  content: String!
}

type User {
  id: ID!
  name: String!
  age: Int!
  gender: String!
}

接着,我们编写一个查询语句查询 SearchResult 的结果,根据结果的不同类型返回不同的字段。例如:

{
  search(query: "GraphQL") {
    ... on Product {
      name
      price
    }
    ... on Article {
      title
      author {
        name
        age
      }
    }
    ... on User {
      name
      age
      gender
    }
  }
}

上述查询语句可以用于搜索一个关键词 "GraphQL",如果搜索结果是 Product 类型,会返回商品的名称和价格;如果搜索结果是 Article 类型,会返回文章的标题和作者的姓名和年龄;如果搜索结果是 User 类型,会返回用户的姓名、年龄和性别。

总结

本篇文章介绍了 GraphQL 的 Union 类型,包括定义、使用和示例。Union 类型是一种可以将不同类型的对象结合在一起的类型,它提供了更多的灵活性和查询效率。使用 Union 类型可以在查询时返回不同类型的对象,提高了查询的效率和灵活性。希望这篇文章对你理解 GraphQL 的 Union 类型有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659630c9eb4cecbf2da103cf


纠错反馈