Ответ 1
Реализовано согласно спецификации: См. 3.a по адресу: http://facebook.github.io/graphql/draft/#SameResponseShape()
Смотрите https://github.com/graphql/graphql-js/issues/1361#issuecomment-393489320 для более подробной информации.
У меня проблема с моим проектом, и я не могу найти никакого решения в Интернете. Здесь ситуация.
DataResult
) 2 типов (Teaser
и Program
)Zone
с полем data
(массив DataResult
)Teaser
& Program
имеют одно и то же поле title
с другим типом (String
и String!
)Вот части схем Zone
, Teaser
и Program
:
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". Что я могу сделать?
Более того, даже если я установлю тот же тип для title
, я получу много предупреждений о "пропущенных полях" в консоли....
PS: я использую Vanilla Apollo в качестве клиента GraphQL (на стороне сервера)
Реализовано согласно спецификации: См. 3.a по адресу: http://facebook.github.io/graphql/draft/#SameResponseShape()
Смотрите https://github.com/graphql/graphql-js/issues/1361#issuecomment-393489320 для более подробной информации.
Использование интерфейса решило эту проблему для меня, включая "отсутствующее поле" - ошибки (хотя это означает, что поля должны быть одного типа, я думаю).
Что-то вроде
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!]
}