如何在 GraphQL 中使用联合查询结果 return 对象类型?
How to return object type with union query results in GraphQL?
我正在构建一个 GraphQL API。当 returning 联合/接口类型字段时,是否可以让服务器告诉我对象类型?即像这样
{
search(text: "an") {
... on Human {
__type
name
height
}
... on Droid {
__type
name
primaryFunction
}
... on Starship {
name
length
}
}
}
// or even better
{
search(text: "an") {
__type // <--- even though it's a Union query, everything has a type right? :/
... on Human {
name
height
}
... on Droid {
name
primaryFunction
}
... on Starship {
name
length
}
}
}
这会 return
{
"data": {
"search": [
{
"__type": "Human",
"name": "Han Solo",
"height": 1.8
},
{
"__type": "Human",
"name": "Leia Organa",
"height": 1.5
},
{
"name": "TIE Advanced x1",
"length": 9.2
}
]
}
}
显然,我可以根据需要通过向对象添加 "type" 字段来手动添加此功能,但我想像这样的东西已经内置到 GraphQL 中了吗?鉴于所有对象都已经有了名称。基本上,我正在尝试将内省信息作为正常查询的一部分进行访问。
这可以使用特殊的元字段 __typename
,它在所有 Graphql 对象和 returns 对象的 Graphql 类型名称上都可用。有关详细信息,请参阅 http://graphql.org/learn/queries/#meta-fields。
PS:看起来 __typename
是唯一可以在内省查询之外调用的元字段。
像这样使用:
{
search(text: "an") {
__typename
... on Human {
name
}
... on Droid {
name
}
... on Starship {
name
}
}
}
我正在构建一个 GraphQL API。当 returning 联合/接口类型字段时,是否可以让服务器告诉我对象类型?即像这样
{
search(text: "an") {
... on Human {
__type
name
height
}
... on Droid {
__type
name
primaryFunction
}
... on Starship {
name
length
}
}
}
// or even better
{
search(text: "an") {
__type // <--- even though it's a Union query, everything has a type right? :/
... on Human {
name
height
}
... on Droid {
name
primaryFunction
}
... on Starship {
name
length
}
}
}
这会 return
{
"data": {
"search": [
{
"__type": "Human",
"name": "Han Solo",
"height": 1.8
},
{
"__type": "Human",
"name": "Leia Organa",
"height": 1.5
},
{
"name": "TIE Advanced x1",
"length": 9.2
}
]
}
}
显然,我可以根据需要通过向对象添加 "type" 字段来手动添加此功能,但我想像这样的东西已经内置到 GraphQL 中了吗?鉴于所有对象都已经有了名称。基本上,我正在尝试将内省信息作为正常查询的一部分进行访问。
这可以使用特殊的元字段 __typename
,它在所有 Graphql 对象和 returns 对象的 Graphql 类型名称上都可用。有关详细信息,请参阅 http://graphql.org/learn/queries/#meta-fields。
PS:看起来 __typename
是唯一可以在内省查询之外调用的元字段。
像这样使用:
{
search(text: "an") {
__typename
... on Human {
name
}
... on Droid {
name
}
... on Starship {
name
}
}
}