【超详细教程】如何使用TypeScript和GraphQL开发应用

GraphQL是一个专为构建灵活的API而生的强大的查询语言。它允许您为数据定义类型系统,因此在执行查询时,它仅返回所需的数据。

与TypeScript一起使用时,GraphQL可以为开发人员提供更好的体验,因为它们都是类型语言。TypeScript是JavaScript的类型化超集,可通过添加类型对其进行扩展。因此,一起使用这些技术肯定会帮助您构建可预测的强类型API。

在本教程中,我将首先解释为什么要结合这些技术,然后通过使用TypeGraphQL从头构建API来展示如何将TypeScript与GraphQL结合使用。

先决条件

本教程假定您有使用TypeScript的经验,尤其是对TypeScript类和装饰器。GraphQL的知识将派上用场,但不是强制性的。

在本指南中,我们将使用TypeGraphQL
,这是一个使用Node.js和TypeScript构建GraphQL API的现代框架。

为什么将TypeScript与GraphQL一起使用

TypeScript是由Microsoft开发和维护的一种流行编程语言。它是JavaScript的超集,它使用静态类型检查使代码可预测。

多年来,TypeScript已被证明是用于大型代码库的有价值的语言。TypeScript通过其类型来提高代码质量,从而增加代码的健壮性,可理解性和可预测性。

GraphQL解决了API过度获取或获取不足的问题。GraphQL 可以通过一次请求就获取你应用所需的所有数据。通过这种方式,GraphQL使您的查询变得灵活,并且您的API可读且易于学习。

TypeScript和GraphQL都依靠类型使代码易于理解。但是,只能使用buildSchema方法或扩展名为.gql的文件在GraphQL模式中定义GraphQL类型。GraphQL解析器不支持GraphQL类型,因为解析器只是常规的JavaScript函数,而不是GraphQL代码。TypeScript解决了这个问题,因为正如我们前面提到的那样,它是JavaScript的超集。因此,它可以在GraphQL解析器上设置类型。这就是为什么将TypeScript与GraphQL一起使用才有意义的原因。

GraphQL处理GraphQL模式的类型,而TypeScript设置GraphQL解析器上的类型。但是,由于要处理多种语言,因此使用Node.js,GraphQL和TypeScript构建强类型的API可能很难维护。

TypeGraphQL打算解决保持模式与解析器之间一致性的问题。TypeGraphQL允许您使用TypeScript类和装饰器来为API创建架构,类型和解析器。它使用TypeScript构建整个GraphQL API。

到目前为止,我们已经了解了为什么将TypeScript与GraphQL搭配一起使用,以及为什么TypeGraphQL在构建和维护使用TypeScript版GraphQL API时很方便。

事不宜迟,让我们深入练习部分,并使用TypeGraphQL构建GraphQL API。

安装

在使用TypeScript和GraphQL之前,我们首先得创建一个Node.js的应用,打开你的终端界面,执行以下命令:

yarn init

或者使用npm包管理器

npm init

然后需要你为项目设定一些信息,不需要填的一路回车就好,最后会在项目目录生成package.json文件。

fantingshengdeMacBook-Pro:graphql-typescript fantingsheng$ yarn init
yarn init v1.12.3
question name (graphql-typescript):
question version (1.0.0):
question description: for study
question entry point (index.js):
question repository url: https://github.com/fantingsheng/graphql-typescript
question author: Timfan
question license (MIT):
question private:
success Saved package.json
✨  Done in 223.35s.

接下来安装一些需要的依赖

yarn add express apollo-server-express graphql reflect-metadata type-graphql class-validator

或者

npm install express apollo-server-express graphql reflect-metadata type-graphql class-validator

我们先下载好这些安装包,然后再解释它们分别是干什么的。另外还要安装它们的类型定义,以便支持TypeScript的使用。

yarn add -D ts-node typescript @types/express @types/node nodemon

或者

npm install -D ts-node typescript @types/express @types/node nodemon

注意:我们安装nodemon是为了在代码更新的时候热重载

下面是每个依赖库的作用解释:

  • express是一个极简的Node版web框架

  • apollo-server-express是一个允许我们在Apollo GraphQL服务中使用express的中间件

  • reflect-metadata使得TypeScript装饰器可以在当一个类已经定义的时候为它添加一个类和成员。它是TypeGraphQL的一个依赖。

  • class-validator允许TypeGraphQL基于验证的情况下使用装饰器和非装饰器

接下来,为项目搭建结构

src
| ├── resolvers
| |  └── todoResolver.ts
| └── schemas
| |  └── Todo.ts
| └── index.ts
├── tsconfig.json
├── package.json
└── yarn.lock

这里有四个文件需要说明下:

  • 应用的入口文件index.ts

  • schemas目录包含了该项目的GraphQL Schema

  • resolvers目录包含了所有API的实现

  • tsconfig.json告诉TypeScript如何去编译代码

与此同时,我们需要在package.json文件中添加服务的执行命令:

"scripts": {"start": "nodemon --exec ts-node src/index.ts"
}

该script命令通过使用nodemon去开启服务,即使代码临时修改,也会重启生效。

为tsconfig.json文件增加配置

{"compilerOptions": {"emitDecoratorMetadata": true,"experimentalDecorators": true}
}

以上这两个属性都要设置为true,以便我们可以在项目中使用TypeScript的装饰器。

我们现在可以为API创建一个GraphQL Schema了。

创建GraphQL Schema

TypeGraphQL使得你可以通过TypeScript的类和装饰器创建一个schema,它仅仅是语法糖而已,最终还是会生成GraphQL代码。这个稍后再说,先创建一个schema

  • schema/Todo.ts

import { Field, ObjectType, InputType } from "type-graphql"@ObjectType() export class Todo {@Field() id: number@Field() title: string@Field() description: string@Field() status: boolean
}@InputType() export class TodoInput implements Partial<Todo> {@Field() title: string@Field() description: string
}

乍一看这语法好像有点奇怪,其实没什么,仅仅是因为增加了TypeScript的装饰器和类的概念在里面

这里的@ObjectType()是由TypeGraphQL提供,为了创建新的对象和schema而存在。Todo类反应了Todo对象的结构,TodoInput定义了我们往Todo里面增加的期望数据
结构。

如下是相同功能的GraphQL代码。

type Todo {id: ID!title: String!description: String!status: Boolean!
}input TodoInput {title: String!description: String!
}

可以看到逻辑完全一样,唯一的不同是没有使用TypeScript。

创建GraphQL Resolver

不像GraphQL,TypeGraphQL将query和mutation语句写在了resolver的里面,当被调用的时候方法名作为唯一入口。

import { Query, Resolver, Mutation, Arg } from "type-graphql";
import { Todo, TodoInput } from "../schemas/Todo";@Resolver(of => Todo)
export class TodoResolver {private todos: Todo[] = []@Query(returns => [Todo], { nullable: true })async getTodos(): Promise<Todo[]> {return await this.todos;}@Mutation(returns => Todo)async addTodo(@Arg('todoInput') {title, description }: TodoInput): Promise<Todo> {const todo = {id: Math.random(),title,description,status: false}await this.todos.push(todo)return todo;}
}

这里我们使用resolver装饰器创建一个新的返回Todo的GraphQL resolver。然后,创建一个GraphQL query去查询所有的Todo类型的数据。

之后,我们再定义一个mutation query往Todo类型的数组里增加一组新的数据。

让我们把代码转化成GraphQL形式

type Mutation {addTodo(todoInput: TodoInput!): Todo!
}type Query {getTodos: [Todo!]
}

到这里,我们就可以通过创建好的schema和resolver来搭建服务了。

搭建服务

  • src/index.ts

import "reflect-metadata";
import { ApolloServer } from "apollo-server-express";
import * as Express from "express";
import { buildSchema } from "type-graphql";import { TodoResolver } from "./resolvers/todoResolver";async function main() {const schema = await buildSchema({resolvers: [TodoResolver],emitSchemaFile: true});const app = Express();const server = new ApolloServer({schema});server.applyMiddleware({ app });app.listen(4000, () =>console.log("Server is running on http://localhost:4000/graphql"));
}main();

我们导入TodoResolver,通过在buildSchema方法里以resolver参数传入,这样来创建一个新的GraphQL Schema。

然后通过schema对象来创建一个ApolloServer

设置属性emitSchemaFile: true来允许TypeGraphQL在打包阶段生成一个schema.gql文件。

通过以下命令来启动应用

yarn start

或者

npm start

在浏览器中访问http://localhost:4000/graphql

在项目根目录下生成了一个schema.gql文件

# -----------------------------------------------
# !!! THIS FILE WAS GENERATED BY TYPE-GRAPHQL !!!
# !!!   DO NOT MODIFY THIS FILE BY YOURSELF   !!!
# -----------------------------------------------type Mutation {addTodo(todoInput: TodoInput!): Todo!
}type Query {getTodos: [Todo!]
}type Todo {description: String!id: Float!status: Boolean!title: String!
}input TodoInput {description: String!title: String!
}

然后添加以下代码到GraphQL运行器中创建一个新的Todo

mutation {addTodo(todoInput: { title: "Todo 1", description: "This is my todo" }) {titledescriptionstatus}
}

然后使用以下GraphQL query查询新的Todo

{getTodos {titledescriptionstatus}
}

好了,我们的功能完成了。

我们已经实现了使用TypeScript构建GraphQL API。

完整代码

https://github.com/fantingsheng/graphql-typescript

References

[1] TypeGraphQL Docs: https://typegraphql.com/docs/introduction.html
[2] TypeScript Decorators Docs: https://www.typescriptlang.org/docs/handbook/decorators.html
[3] TypeScript Classes Docs: https://www.typescriptlang.org/docs/handbook/classes.html
[4] TypeGraphQL Examples: https://typegraphql.com/docs/examples.html
[5] GraphQL Docs: https://graphql.org/learn/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jpa jsf_完整Web应用程序Tomcat JSF Primefaces JPA Hibernate –第2部分

jpa jsf托管豆 这篇文章是本教程第1部分的继续。 在“ com.mb”包中&#xff0c;您将需要创建以下类&#xff1a; package com.mb;import org.primefaces.context.RequestContext;import com.util.JSFMessageUtil;public class AbstractMB {private static final String KEEP…

【利好工具】JavaScript及时运行调试工具

今天要介绍的这个工具叫RunJS[1]&#xff0c;是运行在各大系统上的客户端&#xff0c;目前支持主流的macOS、Windows、Debian和Universal Linux平台。你可以在上面编写你的JavaScript或TypeScript代码&#xff0c;并且获得即时反馈。它的左边是代码区域&#xff0c;右边是输出结…

CIFAR-10 dataset 的下载与使用

基本信息 CIFAR-10 是一个包含60000张图片的数据集。其中每张照片为32*32的彩色照片&#xff0c;每个像素点包括RGB三个数值&#xff0c;数值范围 0 ~ 255。 所有照片分属10个不同的类别&#xff0c;分别是 airplane, automobile, bird, cat, deer, dog, frog, horse, ship, tr…

教你如何创建一款属于自己的VSCode主题

你有没有想过创建一款属于自己的VSCode主题&#xff1f;没有你想像的那么难&#xff0c;但是真正实现起来也不是那么轻松&#xff0c;需要你对将要去改变的主题的一些属性要有所了解和准备。如果你要想让你的主题适用于多种编程语言&#xff0c;并且看起来还很漂亮的话&#xf…

调试

http://www.cnblogs.com/CARPE-DIEM-wu/p/7798119.html 黄金规则 从帮助台得到的观点是不明确的 检查插头 不要想,而要看 回到目录制造失败 回到目录不要想,而要看 回到目录分而治之 回到目录一次只改一个地方 回到目录保持审计跟踪 回到目录检查插头 回到目录获得全新观点 回到…

【视频内含福利】原来手机套壳视频是这么做出来的

最近视频圈子里都在发这种视频&#xff0c;究竟是怎么做出来的&#xff1f;研究下来发现原来是用的这款名字叫Record Maker的APP&#xff0c;旨在帮助用户轻松快速给视频加上手机壳的效果。目前App Store上的版本是1.2.1&#xff0c;最近一次更新支持了iPhone11/iPhone12模型&a…

apache thrift_使用Java快速入门的Apache Thrift

apache thriftApache Thrift是由facebook创建的RPC框架&#xff0c;现在它是一个Apache项目。 Thrift允许您在不依赖语言的定义文件中定义数据类型和服务接口。 该定义文件用作编译器的输入&#xff0c;以生成用于构建通过不同编程语言进行通信的RPC客户端和服务器的代码。 您也…

前端八大灵感设计,代码变为现实

我们都知道掌握编程技术是一项很难的事情&#xff0c;没有捷径可走。需要我们在日复一日的工作中去锻炼。如果想要达到擅长甚至需要长年累月的积累。下面列举了一些可以给你带来编码灵感的例子&#xff0c;相信你看到会有想去写代码的冲动。因为一个好的工程师&#xff0c;是不…

Apple 公司开发者账号添加团队成员

Apple 公司开发者账号添加团队成员 简介 首先公司内部团队开发需要的账号类型为公司账号&#xff0c;可以添加团队成员协同开发。 账号下的团队成员有三种角色&#xff1a; Team Agent (代理) 代理: 就是注册开发者账号的那一个&#xff0c;权限最高&#xff0c;续费和创建开发…

八个使前端工程师惊艳的效果设计,码否?

我们都知道掌握编程技术是一项很难的事情&#xff0c;没有捷径可走。需要我们在日复一日的工作中去锻炼。如果想要达到擅长甚至需要长年累月的积累。 下面列举了一些可以给你带来编码灵感的例子&#xff0c;相信你看到会有想去写代码的冲动。 因为一个好的工程师&#xff0c;…

OpenStack_I版 1.准备过程

openstack是一个开源云平台&#xff0c;python开发此次部署为实验环境&#xff0c; 采用扁平化简单的网络架构部署  优点&#xff1a;低耦合的&#xff0c;模块化Nova 计算资源池Glance 镜像服务Swift 对象存储Horizon 对计算资源&#xff0c;网络资源起别…

快点,再快点!

现在看视频不来个两倍速&#xff08;或者更快&#xff09;都觉得在浪费生命。特别是在看视频教程的时候&#xff0c;文字我们可以做到一目十行&#xff0c;但是视频呢&#xff0c;如果有字幕&#xff0c;我们甚至不用听清&#xff0c;用3倍速或者4倍速完全没有问题&#xff0c;…

jetty eclipse_3个步骤实现Jetty和Eclipse集成

jetty eclipse本教程将引导您逐步了解如何集成Jetty和Eclipse&#xff0c;以及如何在Eclipse中的Jetty服务器上运行Web应用程序。 脚步&#xff1a; 安装Jetty Eclipse插件 建立网路应用程式 运行网络应用 1 –安装Jetty Eclipse插件 将服务器添加到“服务器”视图时&…

使用React和Tailwind CSS搭建项目模板

公众号关注 “太空编程”设为 “星标”&#xff0c;带你了解硬核的编程知识&#xff01;众所周知&#xff0c;Tailwind CSS框架越来越流行&#xff0c;所以我决定尝试学习并使用Tailwind CSS来搭建一个项目模板&#xff0c;一方面自己深入学习下&#xff0c;二来帮助新人更快地…

PHP实现前台页面与MySQL的数据绑定、同步更新

今天我来给大家介绍一个PHP-MySQL的小项目。 使用 PHP和前台Ajax 实现在前台对MySQL数据库中数据的增、删等操作语句功能。 如果有问题&#xff0c;欢迎拍砖~ 有不懂的地方&#xff0c;提出来咱们一起探讨~ 首先&#xff0c;我们先做好前台HTML、CSS样式&#xff0c;代码如下&a…

如何用Vue实现简易的富文本编辑器,并支持Markdown语法

前端开发经常会用到富文本编辑器&#xff0c;比如CKEditor&#xff0c;动不动一个库几十M的代码量&#xff0c;其中涉及许多你可能用不到的功能特性和相关设置&#xff0c;CKEditor最新版本的代码仓库就有接近2000个JS文件&#xff0c;300,000行代码。 可是如果你只需要一个简…

互联网基建成果,快速实现一个clubhouse要多久

最近国外的一款基于语音的社交软件clubhouse掀起了一股热潮&#xff0c;尤其是在Eleon Musk的带动下&#xff0c;整个互联网圈内人都在第一时间抢先体验。不管它为什么会火&#xff0c;肯定不是技术上有什么特别的优势。随着整个互联网技术生态的不断发展&#xff0c;互联网基础…

阿里帝国到底有多庞大

马云&#xff0c;男&#xff0c;1964年9月10日生于浙江省杭州市&#xff0c;祖籍浙江省嵊州市谷来镇&#xff0c; 阿里巴巴集团主要创始人&#xff0c;现担任阿里巴巴集团董事局主席、日本软银董事、TNC中国理事会主席兼全球董事会成员、华谊兄弟董事、生命科学突破奖基金会董事…

如何搭建一个内部组件共享平台

如今前端越来越趋于组件化的开发方式&#xff0c;最大的益处就是UI页面和逻辑的共用。在开发者的眼里&#xff0c;如果你打开一个网站&#xff0c;组件化的开发方式会让你看起来像这个样子&#xff1a;逻辑功能上我们会封装成一个库&#xff0c;然后NPM发布到公共仓库上&#x…

不要讨厌HATEOAS

或我如何学会不再担心和爱HATEOAS REST已成为实现Web服务的事实上的解决方案&#xff0c;至少已成为一种流行的解决方案。 这是可以理解的&#xff0c;因为REST在使用HTTP规范时提供了一定程度的自我文档。 它经久耐用&#xff0c;可扩展&#xff0c;并提供了其他一些理想的特…