Вы можете определить их как объединение (или интерфейс, если все типы реализации имеют общие поля)
Пример схемы объединения:
type Query {
blocks: [ ContentBlock! ]!
}
type Video {
url: String!
}
type Quote {
body: String!
author: String
}
type Advertisement {
src: String!
backgroundColor: String
}
union ContentBlock = Video | Quote | Advertisement
Пример схемы интерфейса:
type Query {
blocks: [ ContentBlock! ]!
}
type Video implements ContentBlock {
id: ID!
url: String!
}
type Quote implements ContentBlock {
id: ID!
body: String!
author: String
}
type Advertisement implements ContentBlock {
id: ID!
src: String!
backgroundColor: String
}
interface ContentBlock {
id: ID!
}
Пример распознавателя:
{
ContentBlock: {
__resolveType (source) {
if (source.url) return 'Video'
if (source.src) return 'Advertisment'
if (source.author || source.body) return 'Quote'
}
}
}
Пример запроса:
{
blocks {
...on Video {
url
}
...on Quote {
body
author
}
...on Advertisement {
src
backgroundColor
}
}
}
Подробнее о союзах и интерфейсах в GraphQL