Вложенные встроенные фрагменты в graphql

Учитывая тип объединения graphql

union SearchResult = Human | Droid | Starship

и следующий запрос graphql:

{
  search(text: "an") {
    ... on Human {
      ... on SearchResult {
        ... on Droid {
          appearsIn
        }
      }
    }
  }
}

Почему в graphql синтаксически правильно перейти от встроенного фрагмента «подтипа» (Human) к встроенному фрагменту «супертипа» (SearchResult) и обратно к другому встроенному фрагменту «подтипа» (Droid)? Есть ли для этого какие-нибудь варианты использования?

Для меня это действительно не имеет смысла и должно вызывать ошибку. Это приводит к мертвым частям запроса, таким как встроенный фрагмент Droid выше, который не влияет на результат запроса.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
0
0
904
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Без этого правила именованные и встроенные фрагменты могут вести себя одинаково, и это может иметь смысл, если у вас есть более задействованные фрагменты «получения общих битов» для типов интерфейса или объединения. Если вы разделите запрос таким образом:

fragment SearchResultBits on SearchResult {
  ...on Droid { appearsIn }
  # could have parts for other union choices too
}
query DoSearch($text: String!) {
  search(text: $text) { ... SearchResultBits }
}

Тогда по вашему запросу очень разумно повторно использовать (названный) SearchResultBits

query FromQuestion {
  search(text: "an") {
    ... on Human {
      name
      ... SearchResultBits
    }
    # or return nothing for non-humans
  }
}

Поскольку указанная ссылка на фрагмент и встроенный фрагмент ведут себя одинаково, вы получите здесь тот же результат. Кажется более разумным, чтобы эта именованная ссылка на фрагмент была законной, и поэтому, похоже, нет веских причин для запрета эквивалентного встроенного фрагмента.

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