Существует ли правильный шаблон для смешивания различных типов в GraphQLUnionType? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть проблема, когда мне нужно создать запрос, который будет возвращать различные возможные типы для узла, я также использую свойство __typename, чтобы определить, какой из них я получил.

Причина, по которой я не используютип EnumType объясняется тем, что различные подтипы могут сильно различаться.

Некоторые из них пусты (например, они не обладают какими-либо свойствами).

Это вызывает проблему, поскольку я не могу создать UnionType.

Я пытался использовать ScalarTypes для этих пустых определений, но для Union я могу использовать только ObjectTypes, для которых требуется определение 'fields'.

Например, вот некоторые определения классов Iиспользуется со стороны сервиса

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 голосов
/ 19 декабря 2018

Я бы, вероятно, обошел это, добавив какое-то поле к пустым в противном случае типам объектов.

"""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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...