Обратите внимание, что имя по-прежнему указано на Starship, потому что в противном случае оно не будет отображаться в результатах, учитывая, что Starship не является персонажем!
Это просто означает, что, поскольку мы используемТип Union, учитывая два типа, которые являются частью Union и оба имеют поле name
, вам все равно нужно запросить поле name
для каждого типа во встроенном фрагменте.Пропуск name
для фрагмента Starship
, но включение его в Character
означает, что если возвращаемый тип равен Character
, поле имени будет присутствовать, но не будет присутствовать в типе Starship
.
В документах упоминается об этом, чтобы подчеркнуть разницу между объединениями и интерфейсами. Если бы SearchResult был Интерфейсом, который включал поле name
, а Character
и Starship
реализовали этот Интерфейс, вы могли бы сделать что-то вроде этого:
{
search(text: "an") {
name
__typename
... on Human {
height
}
... on Droid {
primaryFunction
}
... on Starship {
length
}
}
}
Но так как Союзыне гарантируйте, что какие-либо поля совместно используются их типами, это невозможно сделать с помощью Unions.
Что касается поиска, это не то, что встроено в GraphQL.Эта конкретная схема имеет поле search
типа Query
, и это поле разрешается определенным образом.Если бы вы создавали сервер, вы могли бы написать поле поиска, которое рассматривало запрашиваемые поля как часть критериев поиска.Но это деталь реализации, не связанная с тем, как GraphQL работает в целом.