GraphQL中如何实现类型转换?如何访问不同类型的专属字段?
问题描述
比如,通过GitHub Explorer可以获取拉取请求的不同类型时间线项(本示例中为PULL_REQUEST_COMMIT和PULL_REQUEST_REVIEW):
{ repository(name: "react", owner: "facebook") { pullRequests(last: 10) { nodes { number timelineItems(last: 10, itemTypes: [PULL_REQUEST_COMMIT, PULL_REQUEST_REVIEW]) { nodes { __typename } } } } } }
现在我该如何访问PullRequestEvent或PullRequestReviewEvent类型的不同字段?换句话说,GraphQL中是否支持类型转换或条件判断?
解决方案
GraphQL支持针对不同类型的字段访问,核心实现方式是内联片段(inline fragments),这是处理接口或联合类型字段差异的标准方案,相当于基于类型的条件处理逻辑。
针对你的场景,要获取PullRequestEvent和PullRequestReviewEvent的专属字段,只需在查询中为特定类型编写内联片段即可,示例查询如下:
{ repository(name: "react", owner: "facebook") { pullRequests(last: 10) { nodes { number timelineItems(last: 10, itemTypes: [PULL_REQUEST_EVENT, PULL_REQUEST_REVIEW_EVENT]) { nodes { __typename # 仅当节点为PullRequestEvent类型时,返回以下字段 ... on PullRequestEvent { action createdAt actor { login } } # 仅当节点为PullRequestReviewEvent类型时,返回以下字段 ... on PullRequestReviewEvent { action review { state body } } } } } } } }
核心要点:
__typename字段用于确认当前节点的具体类型,方便调试和区分不同时间线项... on [目标类型名]是内联片段的语法,只有当节点属于该类型时,片段内的字段才会被返回- 你可以根据GitHub GraphQL API的类型定义,添加对应类型的专属字段,比如
PullRequestEvent的action、actor,PullRequestReviewEvent的review等
这种方式就实现了类似“类型转换/条件判断”的效果,让你能在同一个查询中处理不同类型的时间线项,获取各自的专属字段。
内容的提问来源于stack exchange,提问作者Michael Dorner
相关产品推荐
相关产品推荐

