GraphQL Union внутри Союза - PullRequest
       13

GraphQL Union внутри Союза

0 голосов
/ 08 февраля 2019

Ниже приведен запрос, который является концептуально тем, что я ищу.Но я не могу понять, как реализовать ... или даже если это возможно.

query getMedia($id: ID!) {
  media(id: $id) {
    __typename
    title

    ... on Movie {
      fps
    }

    ... on Music {
      duration

      ... on Song {
        lyrics
      }

      ... on Composition {
        movements
      }
    }

  }

В основном, у меня есть типы медиа, если это музыка, есть разные типы музыки.Если запись «Песня», я бы ожидал, что это будет ответом:

{
  "media": {
    "__typename": "Song",
    "duration": 5.67,
    "title": "Some Song",
    "lyrics": "La de da de da de da de day oh",
  }
}

Возможно ли это?

1 Ответ

0 голосов
/ 08 февраля 2019

Для ясности, ваше поле media в том виде, в каком оно появляется в вашем вопросе, должно быть Интерфейсом, а не Союзом, поскольку оно включает по крайней мере одно поле, общее для всех реализующих типов (title).Независимо от того, говорим ли мы об интерфейсах или союзах, предлагаемый вами синтаксис не поддерживается.Только типы объектов могут реализовывать интерфейсы. Аналогично :

Все типы элементов типа Union должны быть базовыми типами Object;Типы Scalar, Interface и Union не должны быть типами членов Union.Точно так же типы переноса не должны быть типами членов Union.

Movie, Song и Composition - все они должны расширять интерфейс Media, и тогда они могут быть запросами.вот так:

query getMedia($id: ID!) {
  media(id: $id) {
    __typename
    title

    ... on Movie {
      fps
    }

    ... on Song {
      duration
      lyrics
    }

    ... on Composition {
      duration
      movements
    }
  }
}

К сожалению, это означает некоторое дублирование ваших встроенных фрагментов.Хорошей новостью является то, что тип объекта может реализовывать несколько интерфейсов , и реализация интерфейса не препятствует его включению в один или несколько объединений.Поэтому, если вам это нужно, вы все равно можете создать интерфейс или объединение Music и использовать его в качестве типа возврата для другого поля.

...