graphql - 检查给定类型是否具有名为 X 的属性。减少内联片段
问题描述
我有一个获取一些事件数组的查询。内部的每个节点都edges
可以实现有限数量的接口。
问题:
是否可以检查给定节点是否具有名为 X 的属性(在本例中为id
,timestamp
和content
)而不是使用多个内联片段 ( ... on {Type}
)?
events(last: $eventCount) {
edges {
node {
... on Type1 {
id
timestamp
content
}
... on Type2 {
id
timestamp
content
}
... on Type3 {
id
timestamp
content
}
... on Type4 {
id
timestamp
content
}
}
}
}
在这个例子中,我想摆脱... on Type1
,... on Type2
等等,只检查id
,timestamp
和content
属性是否存在。
解决方案
根据您要达到的目标,这里有两个答案,但简短的答案是否定的:您不能根据您正在阅读的值有条件地传播片段。
但是,您可以做的是检查接口本身。您提到这些节点都实现了接口。所以我假设这些节点要么都实现了一个通用接口,而nodes
它本身要么列出了一个接口,要么列出了多种类型的联合。
如果您确保所有类型 ,TypeN
都在实现一个包含您要检查的字段的接口,那么您可以简单地在该接口上传播一个片段:
interface BaseType {
id: ID!
timestamp: DateTime
content: String
}
type TypeA implements BaseType {
id: ID!
timestamp: DateTime
content: String
# ...
}
给定此接口,您可以查询实现此接口的每种类型:
{
... on BaseType { id timestamp content }
}
即使您不包括所有字段,这也将起作用。我假设content
例如可能具有不同的类型,这意味着您不能一次在所有类型中查询它。
推荐阅读
- wordpress - 如何在产品和自定义帖子类型下拉 CF7 wordpress 插件中设置第一个选项?
- kentico - 使用管理 API“请求正文大于 maxBodyLength 限制”在 kentico 中上传 25mb 的视频时出现问题
- python - 在 python 中读取大的 zip 文件(不是里面的文件)
- javascript - 为什么 html 中的虚拟脚本块修复 css 动画?
- python - Python 控制台中没有显示
- vue.js - ValidationError:无效的选项对象。Copy Plugin 已使用与 API 模式不匹配的选项对象进行初始化
- anylogic - 检查占用块中的代理
- java - 我在这个 INSERT ROW 语句中做错了什么(java)
- c# - 从 Console.ReadKey().KeyChar 中减去 1
- ios - 使用 React Native 的 iOS 后台通知