8

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

例子:

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

type Person {
    id: String!
    name: String
    address: String
}

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

Fragment PersonCommonFields on Person {
    ...
}

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

4

1 回答 1

9

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
}

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

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

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

于 2018-08-30T16:39:12.083 回答