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