在前端开发中,GraphQL 已经成为了一个流行的后端 API 查询语言。它可以根据客户端的需求提供灵活的数据查询,减少不必要的网络流量。然而,在前端开发中,使用 GraphQL 的难点往往在于构建 GraphQL 的类型和解析器。这时候,npm 包 type-graphql 就可以派上用场了。
type-graphql 简介
type-graphql 是一个针对 TypeScript 类型系统的 GraphQL 框架。它提供了可以根据 TypeScript 类定义自动生成的 GraphQL 类型定义和解析器。这使得我们可以在无需自己手工构建 GraphQL 类型和解析器的情况下,快速地搭建 GraphQL API。
在 type-graphql 中,我们可以使用很多装饰器来定义 GraphQL 类型和字段。比如,ObjectType 装饰器用于定义 GraphQL 对象类型。Field 装饰器用于定义 GraphQL 对象类型的字段。以及,其他与输入类型、枚举类型和接口类型相关的装饰器。
安装和基本使用
要使用 type-graphql,我们需要在项目中安装它:
npm install --save type-graphql
然后,我们需要在 tsconfig.json
中开启 experimentalDecorators
和 emitDecoratorMetadata
:
{ "compilerOptions": { "experimentalDecorators": true, "emitDecoratorMetadata": true, ... } }
现在,我们就可以定义类型和解析器了。以下是一个示例:
-- -------------------- ---- ------- ------ ------------------- ------ - ----------- ------ ----- - ---- --------------- ------------- ----- ----- - -------- -------- ------ - ------- ---------- - ----- ------------- - --------- -- ------ ----- -------- -------------- - ------ --- -------- - -
在这个示例中,我们定义了一个 GraphQL 对象类型 Hello
,它只有一个字段 message
。然后,我们又定义了一个解析器 HelloResolver
,它有一个查询方法 hello
,它返回一个 Hello
类型的对象。
更进一步
上面的示例只是 type-graphql 的一个很小的部分。type-graphql 还提供了许多高级功能和开箱即用的功能,它们可以大大简化我们的代码。
例如,我们可以使用 @FieldResolver
装饰器定义字段解析器。我们还可以使用 @Mutation
装饰器定义 GraphQL 的变更。还有,我们可以使用 @InterfaceType
装饰器定义 GraphQL 接口类型。这里,让我们看一个稍微复杂一些的示例:
-- -------------------- ---- ------- ------ ------------------- ------ - ----------- ------ ------ --------- -------------- ----- --------- ---------- ---- ---- ------------- - ---- --------------- ------------- ---------------- -------- ----- ------ - -------- --- ------- -------- ----- ------- -------- ---- ------- - ------------- ----------- ------ -- ----- -------- ---------- ------ - --- ------- -------- ----- ------- -------- ---- ------- -------- ------- --------- -------- --------- ---- -- --------- ------- - ------------ ----- ------------- - -------- ----- ------- -------- ---- ------- --------- -- --------- ------- --------- -------- --------- ---- -- --------- ------- - ----- ---------- ---------- - --- ------------ -- ------- ----- -------------- - --------- -- --------- ----- ---------- ----------------- - ------ ---------- - --------- -- ------- ----- ----------------- -- -- ---- --- -------- -------------- - ---------- - ------ ---------------- -- ------------ --- ---- - ------------ -- ------- ----- ------------------------ ----- --------------- ----------------- - ----- -------- - ----------------- ----------- - --- ---------------- - -- ------- --- ------------------------- ------ --------- - ----------------- -- --------- ----- --------------------- ------- -------- -------------- --------- - -- --------- -- ------- - ------ --------- - ------ ---------- - -
在这个示例中,我们定义了一个 Person
接口类型和一个 Engineer
对象类型。它们都有 id
、name
和 age
字段。但是,Engineer
比 Person
多了一个 skills
字段和一个可选的 company
字段。然后,我们又定义了一个 EngineerInput
输入类型,它用来添加新的工程师。最后,我们还定义了一个 PersonResolver
解析器,它有三个查询方法和一个添加工程师的变更。
在这个更复杂的示例中,我们使用了许多 type-graphql 提供的功能。特别地,我们使用了 @InterfaceType
装饰器定义了一个 GraphQL 接口类型。我们还使用了 @Mutation
和 @InputType
装饰器定义了 GraphQL 的变更和输入类型。@FieldResolver
装饰器则用于定义复杂字段的解析器。
总之,type-graphql 可以让我们更容易地构建和维护 GraphQL API。它提供了非常便利和强大的功能,使用起来也十分简单。如果你正在学习或使用 GraphQL,不妨试试 type-graphql 吧!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/196160