多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 枚举 枚举类型是一种特殊的标量,它的值仅限于一组特定的允许值(详情请参阅[这里](https://graphql.org/learn/schema/#enumeration-types))。这允许你: - 验证此类型的任何参数都是允许值之一 - 通过类型系统传递一个字段,这个字段始终是一组有限的值之一 ### 代码优先 当使用代码优先方式时,你只需通过创建一个 TypeScript 枚举变量来定义一个 GraphQL 枚举类型。 ```typescript export enum AllowedColor { RED, GREEN, BLUE, } ``` 在这里,我们使用 `@nestjs/graphql` 包里的 `registerEnumType` 函数来注册 `AllowedColor` 枚举。 ```typescript registerEnumType(AllowedColor, { name: 'AllowedColor', }); ``` 现在你可以在我们的类型中引用 `AllowedColor`: ```typescript @Field(type => AllowedColor) favoriteColor: AllowedColor; ``` 最终的结果是在 SDL 中生成以下部分的 GraphQL schema: ```graphql enum AllowedColor { RED GREEN BLUE } ``` 要为枚举提供描述,可以将`description` 属性传递给 `registerEnumType()` 函数。 ```typescript registerEnumType(AllowedColor, { name: 'AllowedColor', description: 'The supported colors.', }); ``` 要为枚举值提供描述,或将值标记为已弃用,可以传递 `valuesMap` 属性,如下所示: ```typescript registerEnumType(AllowedColor, { name: 'AllowedColor', description: 'The supported colors.', valuesMap: { RED: { description: 'The default color.', }, BLUE: { deprecationReason: 'Too blue.', }, }, }); ``` 最终在 SDL 中生成的 GraphQL schema 如下所示: ```graphql """ The supported colors. """ enum AllowedColor { """ The default color. """ RED GREEN BLUE @deprecated(reason: "Too blue.") } ``` ### 模式优先 在模式优先方式中定义一个枚举器,只需在 SDL 中创建一个 GraphQL 枚举类型。 ```graphql enum AllowedColor { RED GREEN BLUE } ``` 然后,你可以使用类型生成功能(如[快速开始](https://docs.nestjs.com/graphql/quick-start)章节所示)生成相应的 TypeScript 定义。 ```typescript export enum AllowedColor { RED GREEN BLUE } ``` 有时,后端会在内部强制使用与公共 API 不同的枚举值。在这个例子中,API 包含 `RED`,然而在解析器中我们可能会使用 `#f00` 来替代(详情请参阅[此处](https://www.apollographql.com/docs/apollo-server/schema/custom-scalars/#internal-values))。为此,需要给 `AllowedColor` 枚举声明一个解析器对象: ```typescript export const allowedColorResolver: Record<keyof typeof AllowedColor, any> = { RED: '#f00', }; ``` > 所有装饰器都是从 `@nestjs/graphql` 包里导出。 然后,将此解析器对象与 `GraphQLModule#forRoot()` 方法的 `resolvers` 属性一起使用,如下所示: ```typescript GraphQLModule.forRoot({ resolvers: { AllowedColor: allowedColorResolver, }, }); ```