types - 在 GraphQL 中重用输入类型作为片段
问题描述
GraphQL 中一个非常常见的用例是创建一个带有突变的对象,并接收完全相同的字段,以及数据库返回的 ID。这是一个相关的问题,询问这个问题。
我的问题是,如何简化这种模式以避免重复字段?我尝试将输入类型作为片段重用,
input ClientInput {
short_name: String
full_name: String
address: String
email: String
location: String
}
type Client {
id: String
...ClientInput
}
...但这失败了
语法错误:预期名称,找到...
我在 Fragments 上看到的所有文档on
和博客文章总是将它们创建为现有类型。这意味着仍然重复除了 ID 字段之外的所有内容:
type Client {
_id: String
short_name: String
full_name: String
address: String
email: String
location: String
}
fragment ClientFields on Client {
short_name: String
full_name: String
address: String
email: String
location: String
}
input ClientInput {
...ClientFields
}
怎么样更好?
解决方案
TL;DR:允许在对象类型和输入对象类型之间共享字段的机制只是不存在。在编写查询时,片段只能在客户端使用。
从规范:
片段允许重复使用常见的重复字段选择,从而减少文档中的重复文本。
片段背后的意图是您可能有任意数量的查询相同类型的已保存查询——如果架构发生更改或您决定不再需要某个字段,您不希望更新 20 个不同的查询。
允许字段在类型和输入类型服务器端之间共享的类似机制只是不存在。这可能很大程度上是设计使然,因为即使 Type 字段和 Input Type 字段都具有某种type
,它们也可能具有其他属性。例如,输入类型字段可以具有默认值,而类型字段不存在该属性。同样,类型字段具有解析器和参数,而输入类型字段没有。
如果你真的想保持 DRY,可能有可用的变通方法,具体取决于你运行的 GraphQL 服务器类型。例如,如果它是一个使用从一个或多个 SDL 字符串创建的模式的 GraphQL.js 服务器,您可以只使用模板文字:
const sharedClientFields = `
short_name: String
full_name: String
address: String
email: String
location: String
`
const schema = `
type Client {
_id: String
${sharedClientFields}
}
type ClientInput {
${sharedClientFields}
}
`
推荐阅读
- php - 允许传递空查询参数的 htaccess 规则
- forms - TYPO3 表单多复选框部分
- java - 如何在 jmx (jconsole bean) 中记录 HystrixCommand 指标
- python - 无法解压 web-socket 数据
- javascript - 如果它们发生碰撞,如何删除数组中的两个游戏对象?
- typescript - TypeScript:允许在具有一些具有不同值类型的键的对象上具有特定值类型的任何键
- matlab - 信号的持续时间会影响其频率分量的幅度吗?另外,采样频率会影响信号的功率吗?
- power-automate - 有没有办法使用 Power Automate 来处理文档?
- typo3 - TYPO3 f:form 带有附加参数,其中提交不更新参数
- python - volttron代理开发调用配置方法onstart