1

下面是一个概念上我正在寻找的查询。但是,我无法弄清楚如何实现......或者即使它是可能的。

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",
  }
}

这可能吗?

4

1 回答 1

0

需要明确的是,您media的问题中出现的字段必须是接口,而不是联合,因为它至少包含一个所有实现类型共有的字段(title)。无论如何,无论我们谈论的是接口还是联合,都不支持您建议的那种语法。只有对象类型可以实现接口。同样

Union 类型的成员类型必须都是 Object 基类型;标量、接口和联合类型不能是联合的成员类型。同样,包装类型不能是联合的成员类型。

MovieSong并且Composition都需要扩展Media接口,然后它们可以像这样查询:

query getMedia($id: ID!) {
  media(id: $id) {
    __typename
    title

    ... on Movie {
      fps
    }

    ... on Song {
      duration
      lyrics
    }

    ... on Composition {
      duration
      movements
    }
  }
}

不幸的是,这确实意味着您的内联片段中有一些重复。好消息是,一个对象类型可以 实现多个接口,并且实现一个接口并不排除它被包含在一个或多个联合中。因此,如果您需要它,您仍然可以创建一个Music接口或联合并将其用作不同字段的返回类型。

于 2019-02-07T23:07:32.767 回答