GraphQL объединение и конфликтующие типы

У меня проблема с моим проектом, и я не могу найти никакого решения в Интернете. Здесь ситуация.

  • У меня есть Союз ("DataResult") 2 типов ("Тизер" и "Программа")
  • У меня есть тип "Зона" с полем "данные" (массив "DataResult")
  • "Тизер" и "Программа" имеют одно и то же поле "заголовок" с другим типом (String vs String!)

Вот части схем "Зона", "Тизер" и "Программа":

type Program {
    title: String
}

type Teaser {
    title: String!
}

union DataResult = Teaser | Program

type Zone {
    (...)
    data: [DataResult!]
}

Когда я попытался запросить данные зоны, как описано в части запроса ниже, я получил ошибку из GraphQL.

zones {
    ...zoneFieldsWithoutData
    data {
        ... on Program {
            ...programFields
        }
        ... on Teaser {
            ...teaserFields
        }
    }
}

Вот ошибка:

Error: GraphQL error: Fields \"title\" conflict because they return conflicting types String and String!. Use different aliases on the fields to fetch both if this was intentional

Я не могу использовать псевдоним, потому что спецификациям нужно одинаковое имя атрибута для всех сущностей "DataResult". Что я могу сделать?

Более того, даже если я установлю тот же тип для "заголовка", я получу много предупреждений о "пропущенных полях" в консоли....

PS: я использую Vanilla Apollo в качестве клиента GraphQL (на стороне сервера)

3 ответа

Я знаю, что вы не можете использовать псевдоним, но для всех, кто может (включая меня):

Простой ответ, взятый из github, - использовать псевдонимы полей:

      zones {
    ... on Program {
        programTitle: title
    }
    ... on Teaser {
        teaserTitle: title
    }
}

Использование интерфейса решило эту проблему для меня, в том числе ошибку "недостающее поле" (хотя это означает, что поля должны быть одного типа, я думаю).

Что-то вроде

interface DataResult {
    title: String!
}

type Program implements DataResult {
    // Not sure if this can be empty?
}

type Teaser implements DataResult {
    // Not sure if this can be empty?
}

type Zone {
    (...)
    data: [DataResult!]
}

Он реализован в соответствии со спецификацией: см. 3.a по адресу: http://facebook.github.io/graphql/draft/

См. https://github.com/graphql/graphql-js/issues/1361 для получения дополнительной информации.

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