如何以编程方式定义递归 GraphQL 类型?

dmi*_*eev 1 javascript graphql

举例来说,我想使用 GraphQL JavaScript 接口定义一个典型的论坛消息类型:

import {
  GraphQLString,
  GraphQLObjectType,
} from 'graphql';

const MessageType = new GraphQLObjectType({
  name: 'Message',
  fields: {
    text: { type: GraphQLString },
    comments: new GraphQLList(MessageType),
  },
});
Run Code Online (Sandbox Code Playgroud)

JavaScript 编译器(好吧,解释器)会抱怨这一点。它会这么说MessageType is undefined

我们都知道可以使用 GraphQL 语言定义这样的类型:

type Message {
    text: String
    comments: [Message]
}
Run Code Online (Sandbox Code Playgroud)

如何使用 GraphQL 纯 JavaScript 接口定义这样的类型?

dmi*_*eev 7

嗯,答案很简单。

您只需传递一个 thunk(不带参数的函数)作为字段,field而不是传递纯 JavaScript 对象。

仅当类型已定义时该函数才会执行,因此它会起作用。

结果代码如下所示:

import {
  GraphQLString,
  GraphQLObjectType,
} from 'graphql';

const MessageType = new GraphQLObjectType({
  name: 'Message',
  fields: () => ({  // <-- Notice the function definition
    text: { type: GraphQLString },
    comments: new GraphQLList(MessageType),
  }),
});
Run Code Online (Sandbox Code Playgroud)