typescript 中不同 GraphQL 语法的优缺点

Posted

技术标签:

【中文标题】typescript 中不同 GraphQL 语法的优缺点【英文标题】:Pros and cons of different GraphQL syntax in typescript 【发布时间】:2018-05-13 12:48:05 【问题描述】:

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

const typeDefs = `
type Query 
  testString: String

`;

然后是使用 express-graphql 包并使用对象来描述模式的下一种方法。这看起来像这样:

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 文件合并在一起并在单个架构中使用它们?

【问题讨论】:

【参考方案1】:

在模式文件或字符串中定义查询可让您快速原型化 GraphQL 接口。这是很好的入门和实现一些解析器。当您的架构增长时,架构定义也会大量增长。我们只有几种类型,但我们的模式文件超过 1000 loc。这就是我们在 javascript 中定义类型并在定义中编写解析器的原因。大多数解析器都非常简单,并且使用包含实际类型解析逻辑的数据加载器。 new tool by GraphCool 允许在模式定义中导入。这种方式违背了我上面的观点,并允许在使用模式语言的同时进行扩展。

顺便说一句:GraphQL 模式定义有语法高亮,例如在 Atom 中通过language-babel

【讨论】:

【参考方案2】:

如果您想在 Node.js 中将 GraphQL 与 TypeScript 一起使用,可以查看TypeGraphQL。

此工具将允许您通过使用装饰器定义打字稿类来摆脱描述类型、查询、变异、参数和输入的接口。 所以你只有一个事实来源,不需要跳过代码库来添加字段、更改其类型等。

【讨论】:

以上是关于typescript 中不同 GraphQL 语法的优缺点的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TypeScript 中获取 GraphQL 架构

如何为 TypeScript 配置 `*.graphql` 导入?

如何修复这个 typescript 和 graphql 错误?

graphql 查询的 typescript 类型声明错误

为 GraphQL 输出解析自动生成的 typescript-mongodb 类型

GraphQL:是不是有相当于 TypeScript 的“未知”?