Skip to content

Enums

What Enums Are

Enums define a named set of possible values.

enum OrderStatus {
  Pending
  Paid
  Shipped
}

Use enums when a field should accept only one value from a known list.

type Order {
  id string
  status OrderStatus
}

Implicit String Values

When a member has no explicit value, its value is the member name.

enum Status {
  Active
  Disabled
}

This is equivalent to:

enum Status {
  Active = "Active"
  Disabled = "Disabled"
}

Explicit String Values

Use explicit strings when the wire value should differ from the member name.

enum ProductStatus {
  Draft = "draft"
  Published = "published"
  Archived = "archived"
}

This is common when generated code should use nice member names while serialized data uses lowercase values.

Integer Enums

Enums can use integer values.

enum Priority {
  Low = 1
  Medium = 2
  High = 3
}

For integer enums, every member must have an explicit integer value.

Invalid:

enum Priority {
  Low = 1
  Medium
  High = 3
}

Do Not Mix Value Kinds

An enum must be consistently string-based or integer-based.

Invalid:

enum MixedStatus {
  Active = "active"
  Disabled = 2
}

Unique Names And Values

Member names must be unique.

Invalid:

enum Status {
  Active
  Active = "active"
}

Member values must also be unique.

Invalid:

enum Status {
  Active = "enabled"
  Enabled = "enabled"
}

Enum Member Docstrings

enum InvoiceStatus {
  """ The invoice is editable and has not been sent. """
  Draft

  """ The invoice has been paid in full. """
  Paid
}

Enum Member Annotations

enum FeatureState {
  @deprecated("Use Enabled instead.")
  Active = "active"

  Enabled = "enabled"
}

Annotations on enum members are available to plugins.

Enum Spreads

Enums can reuse members from another enum with ...Name.

enum StandardRole {
  Viewer = "viewer"
  Editor = "editor"
}

enum WorkspaceRole {
  ...StandardRole
  Owner = "owner"
}

Enum spreads must reference another enum and must use the Name form, not Name.Member.

Naming

Enum names and member names should use PascalCase.

enum PaymentStatus {
  Pending
  Completed
  Failed
}