Перейти к основному содержимому

Типы union и interface

union

Тип union GraphQL представляет собой абстрактный тип, состоящий из одного или более объектных типов. При запросе узла с типом union возвращается объект одного из включенных в данный union подтипов. Это свойство позволяет при запросе узла возвращать тип объекта, определяемый бизнес логикой приложения. Например, запрос union Vacancy, состоящего из типов VacancyError, VacancyItem, VacancyPublicItem, может выглядеть следующим образом

query Vacancy {
vacancy(id: 50000) {
__typename
... on VacancyPublicItem {
title
}
... on VacancyItem {
salary {
from
to
}
}
... on VacancyError {
errorType
}
}
}

Посмотреть в playground

__typename - метаполе, в котором возвращается имя полученного объектного типа;


... on VacancyPublicItem {
title
}

инлайн фрагмент, необходимая часть запроса узла с типом union, содержащая название подтипа и его поля.

Запрос вернет один из трех взаимоисключащих ответов

{
"errors": [],
"data": {
"vacancy": {
"__typename": "VacancyItem",
"salary": {
"from": 10000,
"to": 20000
}
}
},
"dataPresent": true
}
{
"errors": [],
"data": {
"vacancy": {
"__typename": "VacancyPublicItem",
"title": "Новая вакансия"
}
},
"dataPresent": true
}
{
"errors": [],
"data": {
"vacancy": {
"__typename": "VacancyError",
"errorType": "NOT_FOUND"
}
},
"dataPresent": true
}

interface

Так же можно встретить использование типа interface. Например, резюме кандидата имеют общие поля, вынесенные в interface ResumeItem. Запрос кандидатов с резюме может выглядеть следующим образом:

query PersonsWithResume {
persons {
items {
resumes {
items {
id
createdAt
source {
type
}
... on CustomResume {
text
}
... on StructuredResume {
driverLicenses
}
... on LandingResume {
education {
level {
name
}
}
}
}
}
}
}
}

Посмотреть в playground

Общие поля для типов CustomResume, StructuredResume, LandingResume могут запрашиваться вне соответствующих фрагментов.