类型应使用 Apollo Graphql 引用特定的枚举或联合
Type should reference a specific enum or union using Apollo Graphql
我正在尝试创建我认为是 Apollo GraphQL 的联合或枚举,但是,我的理解是菜鸟级的。以下代码的正确写法是什么。
路径:sampleType.graphql
union GridSize = 'auto' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
type Element {
xs: GridSize
}
GraphQL 不像您正在做的那样支持字符串文字或数字文字。例如,在 TypeScript 中,您可以使用这样的文字:
type GridSize = 'auto' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
GraphQL 没有这样的东西。您可以使用枚举:
enum GRID_SIZE {
SOME_VALUE_HERE
SECOND_OPTION
}
但不幸的是,您的示例将不起作用,因为枚举中的值必须遵循此正则表达式 /[_A-Za-z][_0-9A-Za-z]*/
,这意味着它不能以(或仅)数字开头。
那你能做什么?
您可以使用 ,只需创建一个接受 Int | String
的联合。这是最简单的事情。或者,如果你想让它成为“真正的”自己的类型——按照你描述的方式(大部分)——你可以创建一个自定义标量:
"""
The following values are accepted
'auto' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
"""
scalar GridSize
type Element {
xs: GridSize
}
然后您需要创建标量解析器:
const { GraphQLScalarType, Kind } = require('graphql')
const allowedValues = ['auto', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
const gridSizeScalar = new GraphQLScalarType({
name: 'GridSize',
description: `
The following values are accepted
'auto' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
`,
serialize(value) {
// outgoing from your code
if (!allowedValues.includes(value)) {
// or you could throw, but your own code had better not return bad values :)
console.error('something')
return null
}
return value
},
parseValue(value) {
// incoming from input
if (!allowedValues.includes(value)) {
// you probably have a better error message than I do
throw new RangeError('Not a valid Grid Size')
}
return value
},
parseLiteral(ast) {
if ((ast.kind !== Kind.INT) && (ast.kind !== Kind.STRING)) {
// if this value isn't a string or number, it's definitely not OK
return null
}
return ast.value
}
})
然后将其粘贴到您的解析器中
const resolvers = {
Query: {},
Mutation: {},
Whatever: {},
GridSize: gridSizeScalar
}
我正在尝试创建我认为是 Apollo GraphQL 的联合或枚举,但是,我的理解是菜鸟级的。以下代码的正确写法是什么。
路径:sampleType.graphql
union GridSize = 'auto' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
type Element {
xs: GridSize
}
GraphQL 不像您正在做的那样支持字符串文字或数字文字。例如,在 TypeScript 中,您可以使用这样的文字:
type GridSize = 'auto' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
GraphQL 没有这样的东西。您可以使用枚举:
enum GRID_SIZE {
SOME_VALUE_HERE
SECOND_OPTION
}
但不幸的是,您的示例将不起作用,因为枚举中的值必须遵循此正则表达式 /[_A-Za-z][_0-9A-Za-z]*/
,这意味着它不能以(或仅)数字开头。
那你能做什么?
您可以使用 Int | String
的联合。这是最简单的事情。或者,如果你想让它成为“真正的”自己的类型——按照你描述的方式(大部分)——你可以创建一个自定义标量:
"""
The following values are accepted
'auto' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
"""
scalar GridSize
type Element {
xs: GridSize
}
然后您需要创建标量解析器:
const { GraphQLScalarType, Kind } = require('graphql')
const allowedValues = ['auto', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
const gridSizeScalar = new GraphQLScalarType({
name: 'GridSize',
description: `
The following values are accepted
'auto' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
`,
serialize(value) {
// outgoing from your code
if (!allowedValues.includes(value)) {
// or you could throw, but your own code had better not return bad values :)
console.error('something')
return null
}
return value
},
parseValue(value) {
// incoming from input
if (!allowedValues.includes(value)) {
// you probably have a better error message than I do
throw new RangeError('Not a valid Grid Size')
}
return value
},
parseLiteral(ast) {
if ((ast.kind !== Kind.INT) && (ast.kind !== Kind.STRING)) {
// if this value isn't a string or number, it's definitely not OK
return null
}
return ast.value
}
})
然后将其粘贴到您的解析器中
const resolvers = {
Query: {},
Mutation: {},
Whatever: {},
GridSize: gridSizeScalar
}