Это сводит отдельные схемы.
В GraphQL есть два абстрактных типа - интерфейсы и объединения. Поле может возвращать абстрактный тип, но этот тип всегда должен преобразовываться в тип объекта во время выполнения. Объединения и интерфейсы функционально одинаковы, за исключением двух отличий: 1) объединения явно определяют свои возможные типы, в то время как типы должны явно реализовывать интерфейс; и 2) интерфейсы определяют набор общих полей, которые должны иметь все реализующие типы.
Следствием последнего различия является то, что при запросе поля интерфейса вам не нужно использовать фрагмент для указания возможного введите * при запросе общих полей **. Другими словами, тогда как запрос к полю объединения выглядит так:
query {
someUnion {
# no fields allowed outside fragments
... on Foo {
foo
}
... on Bar {
bar
}
}
}
запрос к полю интерфейса может выглядеть так:
query {
someInterface {
aCommonField
anotherCommonField
... on Foo {
foo
}
... on Bar {
bar
}
}
}
Однако важно отметить, что если два типа совместно используют поле, а оба типа реализуют интерфейс, это не обязательно означает, что поле является полем интерфейса. Недостаточно, чтобы поля были общими для выполнения запроса, подобного описанному выше - они должны явно являться частью определения интерфейса.
Так что, действительно ли вы можете избежать ввода name
для каждого встроенного фрагмента, зависит о том, является ли 1) поле интерфейсом и 2) рассматриваемое поле является частью определения интерфейса.