GraphQL, определяющий объединение перед типом

#graphql #graphql-js

#graphql #graphql-js

Вопрос:

Я пытаюсь определить свою схему GraphQL с помощью graphql библиотеки. Схема, которую я пытаюсь достичь, упрощенная, заключается в следующем:

 type TypeA {
  fieldA: String
  fieldAorB: TypeAorB
}

type TypeB {
  fieldB: String
}

union TypeAorB = TypeA | TypeB
 

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

Надеюсь, этот фрагмент подчеркивает мое затруднительное положение.

 import * as graphql from "graphql";

const typeA = new graphql.GraphQLObjectType({
  name: "TypeA",
  fields: { 
    fieldA: { type: graphql.GraphQLString },
    fieldAorB: { type: [???] } // what goes here?
  },
});
const typeB = new graphql.GraphQLObjectType({
  name: "TypeB",
  fields: {
    fieldB: { type: graphql.GraphQLString }
  },
});

const typeAorB = new graphql.GraphQLUnionType({
  name: "TypeAorB",
  types: [typeA, typeB],
});
 

Ответ №1:

После повторного прочтения документации:

Когда два типа должны ссылаться друг на друга, или тип должен ссылаться на себя в поле, вы можете использовать выражение функции (оно же замыкание или удар) для ленивого заполнения полей.

fields может быть замыканием, которое может быть разрешено позже.

т.е.,

 const typeA = new graphql.GraphQLObjectType({
  name: "TypeA",
  fields: () => ({ // note: closure, not object.
    fieldA: { type: graphql.GraphQLString },
    fieldAorB: { type: typeAorB }
  }),
});