Как разделить общие поля между вводом и вводом в 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
На мой взгляд, есть два варианта:
использование
interface
определить ваше общееschema
поляиспользование
es6
синтаксис строкового шаблона. Используйте это как${common}