是否有合适的模式在GraphQLUnionType中混合不同类型?

时间:2018-12-18 18:39:08

标签: graphql

我有一个问题,我需要创建一个查询,该查询将为节点返回不同的可能类型,我还利用__typename属性来确定我收到了哪一个。

我不使用EnumType的原因是因为不同的子类型可能有很大的不同。

其中一些是空的(例如,它们不具有任何属性)。

这会导致问题,因为我无法创建UnionType。

我尝试将ScalarTypes用于这些空定义,但对于Union,我只能使用ObjectTypes,而ObjectTypes需要“字段”定义。

例如,这是我从服务端使用的类的一些定义

classA {
token: string
}

classB {
}

classC {
}
type returnType = classA | classB | classC

对于每个我定义的类型

typeA = GraphQLObjectType ofType classA with fields => {token}
typeB = GraphQLObjectType ofType classB with fields => undefined
typeC = GraphQLObjectType ofType classC with fields => undefined

为查询建立联合类型时发生问题

new GraphQLUnionType({
      types: [typeA, typeB, typeC]
}) 

我想从客户那里做些什么来解决这种情况的正确方法,

query {
   myquery {
     mode: __typename
     ... typeA {
         token
     }
  }

我试图将名称作为属性注入,这行得通,因为每种类型都有一个,但这是多余的。

1 个答案:

答案 0 :(得分:0)

我可能会通过为原本为空的对象类型添加一些字段来解决此问题。

"""Objects of this type don't have properties."""
type classB {
  """Just a placeholder value; always null."""
  _placeholder: Bool
}

一旦有了它就可以正常参与联合类型,并且可以照常查询其__typename。如果您不想这样做,则不必在查询中特别提及。

query {
  myquery {
    __typename
    ... on classA {
      token
    }
    # No need for a fragment ...on classB
  }
}