Types 在GraphQL中将输入类型作为片段重用

Types 在GraphQL中将输入类型作为片段重用,types,graphql,Types,Graphql,GraphQL中一个非常常见的用例是创建一个带有变异的对象,并接收数据库返回的完全相同的字段,以及ID。这里有一个相关的问题 我的问题是,如何简化此模式以避免重复字段?我试着将输入类型作为片段重用 input ClientInput { short_name: String full_name: String address: String email: String location: String } type Client { id: String ...

GraphQL中一个非常常见的用例是创建一个带有变异的对象,并接收数据库返回的完全相同的字段,以及ID。这里有一个相关的问题

我的问题是,如何简化此模式以避免重复字段?我试着将输入类型作为片段重用

input ClientInput {
  short_name: String
  full_name: String
  address: String
  email: String
  location: String  
}

type Client {
  id: String
  ...ClientInput
}
…但那失败了

语法错误:应为名称,找到

我在片段上看到的所有文章和博客文章总是在现有类型上创建它们。这意味着除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个不同的查询

允许在类型和输入类型服务器端之间共享字段的类似机制并不存在。这在很大程度上可能是通过设计实现的,因为即使类型字段和输入类型字段都具有某种类型的
类型
,它们也可能具有其他属性。例如,输入类型字段可以具有默认值,而类型字段不存在该属性。类似地,类型字段有解析程序和参数,而输入类型字段没有

如果您真的想让事情保持干爽,根据您运行的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}
  }
`

谢谢你的回答!既然我的问题被证明是个骗局,你愿意把这个答案移到原来的问题上吗?