Enums

Enums

Enumeration types are a special kind of scalar that is restricted to a particular set of allowed values (read more here). This allows you to:

  • validate that any arguments of this type are one of the allowed values
  • communicate through the type system that a field will always be one of a finite set of values

Code first

When using the code first approach, you define a GraphQL enum type by simply creating a TypeScript enum.


export enum AllowedColor {
  RED,
  GREEN,
  BLUE,
}

With this in place, register the AllowedColor enum using the registerEnumType function exported from the @nestjs/graphql package:


registerEnumType(AllowedColor, {
  name: 'AllowedColor',
});

Now you can reference the AllowedColor in our types:


@Field(type => AllowedColor)
favoriteColor: AllowedColor;

This will result in generating the following part of the GraphQL schema in SDL:


enum AllowedColor {
  RED
  GREEN
  BLUE
}

Schema first

To define an enumerator in the schema first approach, simply create a GraphQL enum with SDL.


enum AllowedColor {
  RED
  GREEN
  BLUE
}

Then you can use the typings generation feature (as shown in the quick start chapter) to generate corresponding TypeScript definitions:


export enum AllowedColor {
  RED
  GREEN
  BLUE
}

Sometimes a backend forces a different value for an enum internally than in the public API. In this example the API contains RED, however in resolvers we may use #f00 instead (read more here). To accomplish this, declare a resolver object for the AllowedColor enum:


export const allowedColorResolver: Record<keyof typeof AllowedColor, any> = {
  RED: '#f00',
}

Hint All decorators are exported from the @nestjs/graphql package.

Then use this resolver object together with the resolvers property of the GraphQLModule#forRoot() method, as follows:


GraphQLModule.forRoot({
  resolvers: {
    AllowedColor: allowedColorResolver,
  },
})