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
интерфейс или объединение и использовать его в качестве типа возврата для другого поля.