GraphQL 是一种用于 API 的查询语言,它允许客户端指定需要的数据,而不是像传统 REST API 那样返回固定的数据模型。在 GraphQL 中,数据模型被组织成类型系统,每个类型定义了可用的字段和关联的类型。
理解 GraphQL 的类型系统对于正确构建 GraphQL API 至关重要。在本文中,我们会探讨 GraphQL 的类型系统的基础知识,并提供一些示例代码来帮助你深入了解。
GraphQL 的类型
GraphQL 的类型有两种:标量类型和对象类型。标量类型是指简单的原始值,如字符串、整数和布尔值。对象类型是指由多个字段组成的复杂对象,这些字段是标量类型或其他对象类型。
以下是一些标量类型:
Boolean:布尔值 Int:32 位带符号整数 Float:浮点数 String:UTF-8 字符串 ID:唯一标识符
以下是一个简单的对象类型:
type Person { name: String age: Int address: Address }
此处定义了一个名为 Person 的对象类型,它有三个字段:name
,age
和 address
。name
和 age
是标量类型,address
是一个复杂对象类型。
Type System
GraphQL 的类型系统使用类型语言来定义对象类型、枚举类型和联合类型。它允许开发者定义可查询的字段、返回值和参数,以及维护类型之间的关系。
对象类型
定义类型时,可以定义字段名称、数据类型和默认值。例如,以下代码定义了一个名为 Address
的对象类型:
type Address { street: String! city: String! state: String! zip: Int! }
字段名称、数据类型和默认值之间的关系涉及到 GraphQL 的非空类型和可空类型的概念。
在 GraphQL 中,!
表示非空,如果一个字段带有 !
,则它不能为 null。如果一个字段没有带 !
,则它可以为 null。在上面的代码中,street
、city
、state
和 zip
都带有 !
,这意味着它们不能为 null。
枚举类型
枚举类型用于限制字段的值,例如下面的代码定义了一个名为 PaymentStatus
的枚举类型:
enum PaymentStatus { PROCESSED DECLINED PENDING }
在这里,枚举类型 PaymentStatus
仅允许三种可能的值:PROCESSED
、DECLINED
和 PENDING
。
联合类型
联合类型允许多个类型共享相同的字段。例如,一个应用程序可以同时处理 Person
和 Organization
类型:
union Searchable = Person | Organization
这个联合类型 Searchable
表示可以搜索 Person
或 Organization
类型对象。
接口类型
接口类型是一个抽象的 GraphQL 类型,它定义了共享字段和字段的数据类型。例如,以下代码定义了一个名为 Searchable
的接口类型:
interface Searchable { id: ID! name: String! }
在这里, Searchable
接口类型需要使用 id
和 name
字段。对象类型必须实现这些字段才能满足接口类型的要求,并成为可搜索类型。例如,一个名为 Person
的对象类型可以实现 Searchable
接口:
type Person implements Searchable { id: ID! name: String! age: Int! }
在这里,Person
类型实现了 Searchable
接口,并提供了所有必需的字段。
示例代码
以下是一个基本的 GraphQL 查询:
-- -------------------- ---- ------- ----- - ---------- ---- - ---- --- ------- - ------ ---- ----- --- - - -
在这个例子中,我们请求一个名为 person
的对象类型,它接收一个 id
参数并返回 name
、age
和 address
字段。address
是一个复杂类型,允许我们请求其内部字段。
整个 GraphQL 查询由三部分组成:操作类型、操作名称和操作体。在上面的代码中,操作类型为 query
,操作名称为空,操作体包含 person
对象类型的请求。
总结
GraphQL 的类型系统是一种强大的工具,用于定义 API 的数据模型和关系。它允许开发者定义对象类型、枚举类型、联合类型和接口类型,以及它们之间的关系。掌握 GraphQL 的类型系统,可以帮助你创建出更加灵活、可扩展的 API,提升用户体验。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6500422995b1f8cacde71ea5