graphql中的嵌套内联片段

graphql中的嵌套内联片段,graphql,union-types,Graphql,Union Types,给定graphql联合类型 union SearchResult = Human | Droid | Starship 以及以下graphql查询: { search(text: "an") { ... on Human { ... on SearchResult { ... on Droid { appearsIn } } } } } 为什么在graphql中,从“子类型”内联片段(Huma

给定graphql联合类型

union SearchResult = Human | Droid | Starship
以及以下graphql查询:

{
  search(text: "an") {
    ... on Human {
      ... on SearchResult {
        ... on Droid {
          appearsIn
        }
      }
    }
  }
}
为什么在graphql中,从“子类型”内联片段(
Human
)到“超级类型”内联片段(
SearchResult
),再回到另一个“子类型”内联片段(
Droid
)在语法上是正确的?这方面有什么用例吗


对我来说,这真的没有意义,它应该抛出一个错误。它会导致像上面的
Droid
内联片段这样的死查询部分,对查询结果没有影响。

如果没有此规则,命名片段和内联片段可以以相同的方式运行,如果您有更多涉及接口或联合类型的“获取通用位”片段,这是有意义的。如果以这种方式拆分查询:

fragment SearchResultBits on SearchResult {
  ...on Droid { appearsIn }
  # could have parts for other union choices too
}
query DoSearch($text: String!) {
  search(text: $text) { ... SearchResultBits }
}
然后在您的查询中,重用(命名)
SearchResultBits

query FromQuestion {
  search(text: "an") {
    ... on Human {
      name
      ... SearchResultBits
    }
    # or return nothing for non-humans
  }
}
由于命名片段引用和内联片段的行为方式相同,因此在这里您将得到相同的结果。这个命名片段引用是合法的似乎更合理,因此似乎也没有强有力的理由禁止等效的内联片段