Inline Fragments

定義で複数のタイプが混ざっている場合( Union )があります。

FooというタイプはABCの Union だと仮にします。そしてABnameというフィールドが含まれてますが、Cにはそれが無いといいうような場合、Cの時に解決できないのでnameフィールドを指定できません。

# 仮
{
  foo: {
    name
  }
}

こんな場合は Union を分解して「Aの時はこのフィールド」...「Cの時はこのフィールド」と別々に構造を決める仕組みがあります。これは Inline Fragment と呼ばれます。

Inline Fragment は ... on Type { ... }という形になります。TypeにはA|B|C{}の中にはそれらが持つフィールドを記述します。

上の例を動くように書き直すと以下のようになります。

{
  foo: {
    ... on A {
      name
    }

    ... on B {
      name
    }

    ... on C {
      # ...
    }
  }
}

GitHub API v4 での例だとこんな実例があります。

{
  search(query: "foo", type: REPOSITORY, first: 1) {
    edges {
      node {
        ... on Repository {
          id
          name
        }
      }
    }
  }
}