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

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

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 ответ

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

Все типы элементов типа Union должны быть базовыми типами Object; Типы Scalar, Interface и 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 интерфейс или объединение и использовать его в качестве типа возврата для другого поля.

Другие вопросы по тегам