下面是一个查询,从概念上讲我在寻找什么。但是,我无法弄清楚如何实现……甚至是不可能。
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",
}
}
这可能吗?
答案 0 :(得分:0)
要清楚,问题中出现的media
字段必须是一个Interface而不是Union,因为它至少包含所有实现类型(title
)。无论如何,无论我们是在讨论接口还是联合,都不会支持您建议的语法。只有对象类型可以实现接口。 Similarly:
“联合”类型的成员类型必须全部为“对象”基本类型;标量,接口和联合类型不能是联合的成员类型。同样,包装类型也不能是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
}
}
}
不幸的是,这确实意味着您的内联片段中有些重复。好消息是,对象类型 can implement multiple interfaces,并且实现接口并不妨碍将其包含在一个或多个联合中。因此,如果需要,您仍然可以创建一个Music
接口或联合,并将其用作其他字段的返回类型。