typescript中不同GraphQL语法的优缺点

typescript中不同GraphQL语法的优缺点,typescript,express,graphql,apollo,Typescript,Express,Graphql,Apollo,我一直在看一些关于GraphQL的不同教程,它们的编写方式都不同。我想知道它们的利弊是什么。另外,您如何在不同的文件中模块化类型、查询等?我看到的第一种方法是使用字符串来描述GraphQL模式,然后将其导出,然后导入到模式文件中。这看起来像这样: const typeDefs = ` type Query { testString: String } `; const todoType = new GraphQLObjectType({ name: 'todo', descript

我一直在看一些关于GraphQL的不同教程,它们的编写方式都不同。我想知道它们的利弊是什么。另外,您如何在不同的文件中模块化类型、查询等?我看到的第一种方法是使用字符串来描述GraphQL模式,然后将其导出,然后导入到模式文件中。这看起来像这样:

const typeDefs = `
type Query {
  testString: String
}
`;
const todoType = new GraphQLObjectType({
  name: 'todo',
  description: 'todo item',
  fields: () => ({
    itemId: {
      type: (GraphQLInt),
      description: 'The id of the todo.',
    },
    item: {
      type: GraphQLString,
      description: 'The name of the todo.',
    },
    completed: {
      type: GraphQLBoolean,
      description: 'Completed todo? '
    }
  })
});
接下来是使用expressgraphql包并使用对象来描述模式的另一种方法。这看起来像这样:

const typeDefs = `
type Query {
  testString: String
}
`;
const todoType = new GraphQLObjectType({
  name: 'todo',
  description: 'todo item',
  fields: () => ({
    itemId: {
      type: (GraphQLInt),
      description: 'The id of the todo.',
    },
    item: {
      type: GraphQLString,
      description: 'The name of the todo.',
    },
    completed: {
      type: GraphQLBoolean,
      description: 'Completed todo? '
    }
  })
});
我看到的另一种方法是使用graphql文件

这仅仅是个人喜好,还是使用其中一种方法比使用另一种方法有真正的好处


我知道我提到的第一个可能缺少语法突出显示,但这看起来最接近实际的graphql语法。我的首选是使用graphql文件。但问题是如何将其全部模块化?如何将多个不同的.graphql文件合并在一起并在单个架构中使用它们?

在架构文件或字符串中定义查询可以让您快速创建graphql接口的原型。这对于开始并实现一些解析器来说是非常好的。当模式增长时,模式定义也将大量增长。我们只有几个类型,但我们的模式文件超过1000 loc。这就是为什么我们在JavaScript中定义类型,并在定义中编写解析器。大多数解析器都非常简单,并使用包含实际类型解析逻辑的数据加载器。 允许在架构定义中导入。这种方法违背了我上面的观点,允许在使用模式语言时进行另一种扩展


顺便说一句:GraphQL模式定义有语法突出显示,例如在Atom中通过
语言babel
如果您想在Node.js中使用带有TypeScript的GraphQL,您可以查看

这个工具将允许您通过使用decorator定义typescript类来摆脱描述类型、查询、变异、参数和输入的接口。 因此,您只有一个真相来源,无需跳过代码库来添加字段、更改其类型等