Working with Enums
1. Defining Enum Types
| Rule | Detail |
|---|---|
| Values | SCREAMING_SNAKE_CASE, no quotes |
| Cannot start | With true, false, null |
| Stable | Renaming is a breaking change |
2. Using Enum Values
| Position | Form |
|---|---|
| Argument literal | users(role: ADMIN) (no quotes) |
| Variable | $role: Role! sent as JSON string |
| Field type | role: Role! |
3. Providing Enum Descriptions
Example: Per-value descriptions
"""User permission tier."""
enum Role {
"Full access"
ADMIN
"Write content"
EDITOR
"Read-only"
VIEWER
}
4. Mapping Enum Values
Example: Internal value mapping
const resolvers = {
Role: { ADMIN: "admin", EDITOR: "edit", VIEWER: "ro" }
};
| Pattern | Use |
|---|---|
| SDL ↔ DB | Map GraphQL values to DB strings/ints |
| SDL ↔ TS enum | Codegen produces matching TS enum |
5. Deprecating Enum Values
Example: @deprecated value
enum Role {
ADMIN
EDITOR
VIEWER
GUEST @deprecated(reason: "Use VIEWER instead")
}
| Rule | Detail |
|---|---|
| Still queryable | Existing clients keep working |
| Hidden in tools | GraphiQL etc. hide deprecated by default |
6. Using Enums in Arguments
7. Using Enums in Filters
| Form | Example |
|---|---|
| Equality | status: PENDING |
| Set | status_in: [PENDING, PAID] |
| Negation | status_not: CANCELLED |
8. Creating Status Enums
9. Creating Role Enums
Example: Role-based access
enum Role { OWNER ADMIN MEMBER GUEST }
enum Permission { READ WRITE DELETE ADMIN }
type User {
role: Role!
permissions: [Permission!]!
}
10. Validating Enum Values
| Layer | Behavior |
|---|---|
| Validation phase | Invalid literal → query rejected before execution |
| Variables | Coerced from string; unknown value → error |
| Resolvers | Receive mapped internal value |