GraphQL Blackbox /“任何”类型?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (85)

是否可以指定GraphQL中的字段应该是黑盒子,类似于Flow具有“任何”类型的方式?我的架构中有一个字段应该能够接受任意值,可以是String,Boolean,Object,Array等。

提问于
用户回答回答于

@ mpen的答案很棒,但我选择了更紧凑的解决方案:

const { GraphQLScalarType } = require('graphql')
const { Kind } = require('graphql/language')

const ObjectScalarType = new GraphQLScalarType({
  name: 'Object',
  description: 'Arbitrary object',
  parseValue: (value) => {
    return typeof value === 'object' ? value
      : typeof value === 'string' ? JSON.parse(value)
      : null
  },
  serialize: (value) => {
    return typeof value === 'object' ? value
      : typeof value === 'string' ? JSON.parse(value)
      : null
  },
  parseLiteral: (ast) => {
    switch (ast.kind) {
      case Kind.STRING: return JSON.parse(ast.value)
      case Kind.OBJECT: throw new Error(`Not sure what to do with OBJECT for ObjectScalarType`)
      default: return null
    }
  }
})

然后我的解析器看起来像:

{
  Object: ObjectScalarType,
  RootQuery: ...
  RootMutation: ...
}

.gql看起来像:

scalar Object

type Foo {
  id: ID!
  values: Object!
}
用户回答回答于

我想出了一个中间解决方案。而不是试图将这种复杂性推到GraphQL上,我选择在将其设置到字段之前使用String类型和JSON.stringify数据。所以一切都得到了字符串化,后来在我的应用程序中,当我需要使用这个字段时,我JSON.parse得到了返回所需对象/数组/布尔值等的结果。

扫码关注云+社区

领取腾讯云代金券