ECMAScript 沒有 enum
,而 Strongly Typed 的 GraphQL 則支援 enum
,讓我們在 GraphQL Playground 可直接選擇 Enumeration 值使用,且還可檢查 Query 的 Argument 值是否正確。
Version
macOS Catalina 10.15
WebStorm 2019.2.3
Node 10.16.3
Apollo GraphQL 2.9.6
Apollo GraphQL
src/index.js
import { ApolloServer, gql } from 'apollo-server'
let data = [
{ title: 'FP in JavaScript', category: 'FP'},
{ title: 'RxJS in Action', category: 'FRP'},
{ title: 'Speaking JavaScript', category: 'JS'}
]
let typeDefs = gql`
type Query {
books(category: BookCategory!): [Book]
}
type Book {
title: String
category: BookCategory
}
enum BookCategory {
FP
FRP
JS
}
`
let books = (_, { category }) => data.filter(x => x.category === category)
let resolvers = {
Query: {
books
}
}
let apolloServer = new ApolloServer({ typeDefs, resolvers })
apolloServer
.listen()
.then(({ url }) => `GraphQL Server ready at ${ url }`)
.then(console.log)
第 3 行
let data = [
{ title: 'FP in JavaScript', category: 'FP'},
{ title: 'RxJS in Action', category: 'FRP'},
{ title: 'Speaking JavaScript', category: 'JS'}
]
除了 title
外,還多了 category
。
19 行
enum BookCategory {
FP
FRP
JS
}
定義 BookCategory
enum,其內包含 FP
、FRP
與 JS
三種值。
enum 值建議使用大寫區別
14 行
type Book {
title: String
category: BookCategory
}
定義 Book
type,category
為 BookCategory
enum。
10 行
type Query {
books(category: BookCategory!): [Book]
}
定義 books
query, 其 category
argument 為 BookCategory
enum。
28 行
let resolvers = {
Query: {
books
}
}
在 resolvers
內定義 books
query。
26 行
let books = (_, { category }) => data.filter(x => x.category === category)
實作 books
resolver。
GraphQL Playground
query {
booksByCategory(category: FP) {
title
category
}
}
使用 booksByCategory
query,可在 GraphQL Playgroud 以 ⌃ ␣
選擇 FP
傳入,只回傳 title
與 category
兩個 field 即可。
Conclusion
enum
算我很喜歡的概念,可惜 ECMAScript 沒有,竟然在 GraphQL 得到救贖- GraphQL Playground 完美支援
enum
,只要使用⌃ ␣
就可選擇 enumeration 值
Reference
Eve Porcello, Query an Enumeration Type with GraphQL
Apollo Docs, Custom scalars and enums