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

时间:2018-08-30 16:10:14

标签: graphql graphql-js graphql-tools

我想知道是否可以在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上”。

2 个答案:

答案 0 :(得分:2)

GraphQL fragments用于查询,而不是架构定义。

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

例如

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或“ anemic mutations”上的task-based / resource突变

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

答案 1 :(得分:0)

看看这个:https://www.apollographql.com/docs/guides/schema-design.html

我认为有两种选择:

  1. 使用interface定义常见的schema字段

  2. 使用es6字符串模板语法。像${common}

  3. 一样使用