2017-02-05 8 views
0

Я в настоящее время находится в процессе преобразования REST API в GraphQL, но я ударил немного в одной из конечных точек.Создание типа GraphQLObjectType с индексируемой сигнатурой поля?

В настоящее время эта конечная точка возвращает объект, ключи которого могут быть неограниченным набором строк, а значения whos соответствуют определенной форме.

Итак, как рудиментарный меня, например, такая ситуация ...

// response 
{ 
    foo: { id: 'foo', count: 3 }, 
    bar: { id: 'bar', count: 6 }, 
    baz: { id: 'baz', count: 1 }, 
} 

Опять же, ключи не известны во время выполнения и может быть неограниченным множеством строк.

В машинопись, например, такая ситуация обрабатывается путем создания интерфейса с помощью индексируемая подпись поля, как так ...

interface Data { 
    id: string; 
    count: number; 
} 

interface Response { 
    [key: string]: Data; 
} 

Итак, мой вопрос: Является ли такого рода вещи возможной с графом? Как я могу создать тип/схему для этого?

Заранее благодарен!

ответ

0

Я думаю, что одно решение может быть использование JSON.stringify() метода

exampleQuery: { 
    type: GraphQLString, 
    resolve: (root, args, context) => { 
     let obj = { 
      foo: { id: 'foo', count: 3 }, 
      bar: { id: 'bar', count: 6 }, 
      baz: { id: 'baz', count: 1 } 
     }; 

     return JSON.stringify(obj); 
    } 
} 

Затем, после получения результата GraphQL запроса можно использовать JSON.parse(result) (в случае, если часть выполнения запроса также написан в JavaScript - в противном случае вам придется использовать эквивалентный метод другого языка для анализа входящего ответа JSON).

Недостаток такого решения состоит в том, что у вас нет возможности выбрать поля obj, которые вы хотите получить из запроса, но, как вы сказали, возвращаемый объект может иметь неограниченное количество строк, которые, вероятно, не являются известный на лицевой части приложения, поэтому нет необходимости выбирать его ключи, верно?

+0

Спасибо за отзыв. Извините за задержку! Я закончил с чем-то подобным для одного конкретного маршрута, но также закончил просто преобразование аналогичного ответа на массив в методе разрешения этого типа. Другими словами ... 'solve: myObj => Object.keys (myObj) .map (key => ({key, value: myObj [key]}));' – dsifford