Как разделить общие поля между вводом и вводом в GraphQL

Мне было интересно, есть ли способ поделиться общими полями между Input и Type в GraphQL, чтобы мне не приходилось определять один и тот же набор полей в нескольких местах.

Пример:

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 ответа

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/task-based мутации над resource или " анемичные мутации"

Я настоятельно рекомендую узнать о толстых запросах и прочитать о спецификации реле. Даже если вы не захотите использовать Relay на клиенте, следование некоторым из их правил может действительно прояснить распространенные заблуждения относительно GraphQL.

Посмотрите это: https://www.apollographql.com/docs/guides/schema-design.html

На мой взгляд, есть два варианта:

  1. использование interface определить ваше общее schema поля

  2. использование es6 синтаксис строкового шаблона. Используйте это как ${common}

Другие вопросы по тегам