Итак, у меня есть внутренний тип объединения, который мне нужно разрешить во время выполнения.На родительском объекте у меня есть поле type
, которое сообщит мне, какой тип мутации произошел, и на том же родительском объекте у меня есть поле payload
, которое имеет тип этого объединения.
enum OrgMutationType {
JOIN_ORG
LEAVE_ORG
CHANGE_PERMISSIONS
}
union OrgMutatedSubscriptionPayloadUnion =
JoinOrgMutationResponse |
LeaveOrgMutationResponse |
ChangePermissionsMutationResponse
type OrgMutatedSubscriptionPayload {
type: OrgMutationType
payload: OrgMutatedSubscriptionPayloadUnion
}
extend type Subscription {
orgMutated(organization: ID!): OrgMutatedSubscriptionPayload
}
В функции __resolveType
я получаю объект payload
и на основании этого мне нужно разрешить тип.К сожалению, они payload
не содержат type
объекта
Так что у меня есть
OrgMutatedSubscriptionPayloadUnion: {
__resolveType(payload) {
// Here i need to access the `parent.type` to make a switch
// and return the appropriate type
}
}
Я хочу получить доступ к родительскому объекту, который содержит поле type
, такчто я сделал переключение на основе этого.
Я обнаружил, что в объекте info
(3-й аргумент в функции __resolveType
) я могу получить доступ к rootValue
, что даст мне доступ к type
поле родителя.Так что я могу сделать это
OrgMutatedSubscriptionPayloadUnion: {
__resolveType(payload, context, info) {
switch(info.rootValue.type) {
case('JOIN_ORG'):
return 'JoinOrgMutationResponse';
case('LEAVE_ORG'):
return 'LeaveOrgMutationResponse';
...
}
}
}
Это хорошая идея, чтобы получить к нему доступ таким образом?Есть ли какие-либо подводные камни?
В противном случае, я думаю, что другое решение - сделать объединение целым родительским типом, который даст мне доступ к полю type
и переключиться на его основе.В этом случае, хотя я вижу, что мне нужно будет реплицировать больше типов, чтобы создать этот союз.
Есть предложения?Является ли info.rootValue
верным решением?