在 GraphQL 中在 Input 和 Type 之间共享公共字段

wei*_*wei 6 graphql graphql-js graphql-tools

我想知道是否有办法在 GraphQL 中共享 Input 和 Type 之间的公共字段,这样我就不必在多个地方定义相同的字段集。

例子:

input PersonInput {
    id: String!
    name: String
    address: String
}

type Person {
    id: String!
    name: String
    address: String
}
Run Code Online (Sandbox Code Playgroud)

我知道 Fragment 可能是一个解决方案,但如果我的理解是正确的,使用 Fragment 总是需要您设置一个 ON 条件,使其看起来像这样:

Fragment PersonCommonFields on Person {
    ...
}
Run Code Online (Sandbox Code Playgroud)

似乎没有办法指定“on Person/PersonInput”。

小智 7

GraphQLfragments用于查询,而不是模式定义。

当我开始学习 GraphQL 时,我也对此感到恼火,因为我仍然在思考 REST。在大多数情况下,可以自由地将某些字段设置为不可为空或从输入/输出类型中完全删除它们是非常宝贵的。

例如

input CreatePersonInput {
  name: String!
  slug: String
  address: String
}

type Person {
  id: ID! # Autogenerated on the server
  name: String!
  slug: String! # Will always exist, either user provided or computed
  # address: String # Omitted for security reasons
}
Run Code Online (Sandbox Code Playgroud)

乍一看似乎有很多额外的代码,但是对于长期项目而言,这为您带来了基于资源的架构的灵活性是值得的。我已经看到它帮助了几十次。

您还应该考虑behavior/task-based突变过度resource或“贫血突变

我强烈建议学习胖查询并阅读中继规范。即使您最终不想在客户端上使用 Relay,遵循他们的一些规则也可以真正消除对 GraphQL 的常见误解。

  • 在我看来,graphql 仍然是一个奇怪的决定。让用户将其分开_如果他们选择的话_,但用户仍然应该可以自由地重用相同的类型。例如,如果我定义了一个“type FullName {firstName: String, lastName: String }”会怎样。为什么我必须定义一个单独的“FullNameInput”?更不用说,原始类型“String”、“Boolean”和“Int”没有相应的“StringInput”、“BooleanInput”等,因此它们清楚地知道在相同情况下重用是可以的...... (9认同)