在GraphQL中共享输入和类型之间的公共字段

问题描述 投票:1回答:2

我想知道是否有一种方法可以在GraphQL中共享输入和类型之间的公共字段,这样我就不必在多个位置定义相同的字段集。

例:

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

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

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

Fragment PersonCommonFields on Person {
    ...
}

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

graphql graphql-js graphql-tools graphql-tag
2个回答
2
投票

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

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

EG

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或“anemic mutations

我强烈建议学习fat queries并阅读有关Relay Specification的内容。即使你最终不想在客户端上使用Relay,遵循他们的一些规则也可以清除对GraphQL的常见误解。


0
投票

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

对于我的意见,有两种选择:

  1. 使用interface定义您常见的schema字段
  2. 使用es6字符串模板语法。像${common}一样使用它
© www.soinside.com 2019 - 2024. All rights reserved.