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 для получения дополнительной информации.