概述
在Odyssey Lift-off 系列中,我们学习了如何编写模式,其中包含字段,返回标量或对象类型。
使用标量类型,如Int
或String
,字段可能会有很多可能的值。但有时,您希望将字段的返回值限制为几个选项。这就像使用下拉选择器并从预先验证的值列表中进行选择,而不是使用空的文本输入并输入想到的任何内容一样!
这就是enum
类型的用武之地!
在本课中,我们将
- 了解什么是枚举,以及如何在GraphQL 模式中定义枚举
- 查看枚举在 Airlock 代码库中如何使用的示例
什么是enum
?
一个枚举是GraphQL 模式类型,它表示一个预定义的可能值列表。
例如,在 Airlock 中,房源可以是某一特定类型的地址:一艘宇宙飞船、一栋住宅、一个露营地、一间公寓或一个房间。我们在模式中通过 locationType
字段表示这一点。
利用我们迄今所了解的内容,我们可以 将定义 locationType
字段为 String
。但是,我们可能会遇到数据一致性问题。例如,如果一位用户在输入“spaceship”(太空飞船)时不小心输成了“space ship”,会发生什么情况?如果他们输入的值不是一个有效的地址类型,比如“narwhal”(独角鲸)或“pickle chips”(腌菜脆片)又会发生什么情况?我们在过滤或整理房源时可能会遇到不必要的复杂情况。
为了保持数据的整洁一致,将 locationType
字段的可能值限定为更少的一组值会很有帮助。我们通过一个枚举在模式中定义此约束。
定义 enum
要定义枚举,我们以 enum
关键字开头,接着是使用帕斯卡命名法表示的枚举名称,然后是花括号 ({}
)。在花括号中,我们添加可能值的列表。根据约定,这些值均以大写表示。
以下是如何为 Airlock 中可能的地址类型定义枚举的示例
enum LocationType {SPACESHIPHOUSECAMPSITEAPARTMENTROOM}
使用 enum
一旦枚举定义完毕,我们可以将其用作 字段的返回类型,使用方式与处理其他任何 标量或 对象类型相同。
以下是 LocationType
枚举如何用于 Listing
类型的 locationType
字段的示例:
type Listing {# ..."The location type of the listing"locationType: LocationType!# ...}
这意味着,当我们对特定列表的 查询时locationType
,它将返回在 LocationType
枚举中列出的某个选项。
query GetListingType {listing(id: "listing-1") {locationType # returns CAMPSITE}}
在 Airlock 代码库中查看
Airlock 架构中定义了多个枚举。在 server/schema.graphql
文件中查看它们。
- 你对架构中现有的枚举有什么发现?
- 还有哪些 字段可能是返回枚举的候选字段?那个枚举可能有哪些值?
练习
在下面的架构定义中,定义一个新枚举,称为 OrderStatus
,其可能的值为:SUBMITTED
、CONFIRMED
、SHIPPED
、DELIVERED
或 CANCELLED
。然后向 Order
类型添加一个名为 orderStatus
的新字段,并使其解析为新枚举中的(非空)值。
要点
- 一个
enum
类型在我们的 GraphQL 架构 中定义了一个预设的选项列表。 - 枚举用于保持数据值的统一。
接下来
在下一课中,我们将了解 input
类型:用于保持架构一致的另一工具。