GraphQL: получение дочерних элементов конкретной реализации

#javascript #jestjs #graphql #shopify #apollo

#graphql

Вопрос:

Я получаю объект GraphQL с полем «дочерние элементы». Это поле имеет тип ‘X’ и имеет две разные реализации, ‘Y’ и ‘Z’.

Поэтому, когда я выполняю свой запрос, я могу сделать это :

 {
    fieldOne
    fieldTwo
    children {
        ... on Y {
            fieldOne
            fieldTwo
        }
        ... on Z {
            fieldOne
        }
    }
}
  

Есть ли способ для меня получить дочерние элементы только с реализацией Y ?

Потому что, если я делаю это :

 {
    fieldOne
    fieldTwo
    children {
        ... on Y {
            fieldOne
            fieldTwo
        }
    }
}
  

Я получу и объект, который выглядит следующим образом :

 {
    fieldOne
    fieldTwo
    children [
        {}, // Z implementation
        {}, // Z implementation
        {
            fieldOne,
            fieldTwo
        }, // Y implementation
    ]
}
  

Спасибо 🙂

Ответ №1:

То, что вы видите, является ожидаемым поведением. Из спецификации:

Фрагменты могут быть определены встроенно в наборе выбора. Это делается для условного включения полей на основе их типа среды выполнения.

Условия типа, подобные ... on Y , — это просто способ отфильтровать, какие поля разрешаются на основе типа среды выполнения. Они не являются способом фильтрации фактического списка результатов. На самом деле, в GraphQL нет встроенной фильтрации.

Для фильтрации списка, включающего только определенные типы (или на основе любого другого условия), рассматриваемое поле должно иметь какой-то аргумент фильтра и логику преобразователя, которая использует его для фактического выполнения фильтрации.

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