У меня есть сервис Apollo GraphQL, который делегирует внутренний сервис gRPC. У этой службы есть конечная точка, которая возвращает сообщение, содержащее oneof
, которое я сопоставляю с Union
в GraphQL.
Это просто, но при внедрении распознавателей требуется немало примеров. Предположим, у меня есть следующее определение сообщения protobuf:
message MyUnionMessage {
oneof value {
UnionType1 type1 = 1;
UnionType1 type2 = 3;
UnionType1 type3 = 4;
}
}
message UnionType1 {<type 1 props>}
message UnionType2 {<type 2 props>}
message UnionType3 {<type 3 props>}
Моя соответствующая схема GraphQL выглядит примерно так:
union MyUnionType = UnionType1 | UnionType2 | UnionType3
type UnionType1 {<type 1 props>}
type UnionType1 {<type 2 props>}
type UnionType1 {<type 3 props>}
В привязке javascript для gRPC объект MyUnionMessage
будет иметь два свойства: value
, которое представляет собой строку, указывающую, какой тип значения содержится, и свойство, названное для этого типа. Так, если бы у меня был MyUnionMessage
, содержащий, например, UnionType2
, объект выглядел бы так:
{
value: 'type2',
type2: {...}
}
Это хорошо для реализации __resolveType
, поскольку я могу сделать простое switch
для значения в value
, но тогда мне нужно написать преобразователь для всех полей всех из конкретных типов.
То, что я ищу, это чтобы я мог что-то вроде этого:
resolvers = {
MyUnionType: {
__resolveType(obj) {
switch(obj.value) {
case 'type1': return 'UnionType1';
case 'type2': return 'UnionType2';
case 'type3': return 'UnionType3';
default: return null;
},
__resolveValue(obj) {
return obj[obj.value];
},
},
};
По сути, я хочу написать «преобразователь» на уровне универсального типа объединения (или интерфейса), который преобразует объект перед его передачей в конкретный преобразователь.
Возможна ли такая вещь?