联盟内部的GraphQL联盟

时间:2019-02-07 22:08:33

标签: graphql graphql-tag

下面是一个查询,从概念上讲我在寻找什么。但是,我无法弄清楚如何实现……甚至是不可能。

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 :(得分:0)

要清楚,问题中出现的media字段必须是一个Interface而不是Union,因为它至少包含所有实现类型(title )。无论如何,无论我们是在讨论接口还是联合,都不会支持您建议的语法。只有对象类型可以实现接口。 Similarly

  

“联合”类型的成员类型必须全部为“对象”基本类型;标量,接口和联合类型不能是联合的成员类型。同样,包装类型也不能是Union的成员类型。

MovieSongComposition都需要扩展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接口或联合,并将其用作其他字段的返回类型。