定義で複数のタイプが混ざっている場合( Union )があります。
FooというタイプはAとB、Cの Union だと仮にします。そしてAとBはnameというフィールドが含まれてますが、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
}
}
}
}
}