- 原文地址:How to start with backend TypeScript and use it’s full potential.
- 原文做者:idchlife
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:xilihuasi
- 校对者:tvChan, noahziheng
我将从一个开发者的角度介绍几个优秀的库。它们能够知足你后端应用的绝大部分特性。装饰器和元数据的能力在这些库中获得的充分的应用,使其很是强大而且简单易用。前端
我但愿这篇文章能够帮到像我这样,喜欢 TypeScript 并且想用它编写后端代码的人,让他们像我同样发现这些库以后乐在其中。node
TL;DR —— 堆栈使你的后端应用像许多使用其余语言的企业静态解决方案同样强大:android
使用装饰器,参数,body 注入的路由和控制器的库ios
依赖注入和使用装饰器的 services 的库git
使用装饰器的 ORM 就像 Doctrine/Hibernate 那样方便操做实体github
给那些还不熟悉使用 TypeScript 写后端的朋友的小建议typescript
Routing-controllers:控制器,行为,请求等数据库
pleerock/routing-controllers routing-controllers —— 建立结构化,声明性和组织良好的基于类的控制器后端
尽管这个库是做为 Express/Koa 的 TypeScript helper 编写的,它也会对你编写控制器有所帮助,就像你在 Java/PHP/C# 的企业级框架里用到的那样。bash
下面是一个控制器的小例子:
import {JsonController, Param, Body, Get, Post, Put, Delete} from "routing-controllers";
@JsonController()
export class UserController {
@Get("/users")
getAll() {
return userRepository.findAll();
}
@Get("/users/:id")
getOne(@Param("id") id: number) {
return userRepository.findById(id);
}
@Post("/users")
post(@Body() user: User) {
return userRepository.insert(user);
}
}
复制代码
这对一些人来讲就像是摆脱了噩梦:再也不有带路由的组件,充满嵌套的中间件以及具备注入,验证和请求参数的中间件的实现(是的,你甚至能够定义参数类型和是否必传!如 @Body({ required: true, validate: true }) 这种写法将能很好地工做,若是缺乏参数或者不正确的请求就会抛出异常)
装饰器有不少有用的特性,如基础控制器的 @Controller,可在 actions 中定义内容的类型以及使用 @JsonController 服务和接收 JSON。
我正在 Express 中使用它,既然咱们有了 async/await (即便 TS Node.js 开发已通过了好几个月我仍是忍不住赞美)咱们彷佛再也不须要 Koa 了(如今 routing-controllers 能够更好的支持 Express )。并且 Express 有更大的类型集 @types。
下面是我项目中使用 routing-controllers 和其余 @pleerock 库(VSCode, 若是有兴趣的话,引用来自 TypeLens 插件)的例子:
如你所见,routing-controllers 甚至提供了 undefined 返回码(也有 empty 和 null 的装饰器)以及许多其余特性。关于 this.playerService —— 这是另外一个迷人的库,稍后我将介绍它。
整体来看,库有强大的文档,它能够帮助你理解和构建适用于操做甚至整个控制器的自定义中间件的应用程序(这对我来讲是个绝妙的时刻)。连接地址如你所见就在那,很是方便。
固然,你也可使用不少 Express/Koa 中间件把你的应用抽离出来,以及视图配置(库也有针对视图的装饰器),认证(能够经过中间件应用到整个控制层),错误处理等方面的配置。
一般我把他们存放在 /controllers 文件夹。
TypeDI:依赖注入,services
这个库帮我定好了项目结构,方便编码而且不用去想「好吧 service 存在哪里,这个是 service?唔或许是另外一个,可是,它怎么依赖另外一个 service?怎么引用其余 service 唔。」
回到个人 PlayerService,下面这部分你能够看到它依赖了什么(其余 services):
@Inject 对我来讲是在处理 services 和逻辑完整的后端应用方面最好用的装饰器。
(若是你想了解 @OrmEntityManager —— 另外一个来自 @pleerock 的库,稍后我将讲解)
是的,你能够有不少 services 依赖其余的 services。而且若是你有 service 循环依赖,你能够经过明确地定义类型来解决这个问题(库的文档涵盖了大部分的问题和情景)
对那些不熟悉 services,service 容器,services 依赖注入等的朋友。简要说明:
你有某种功能,想把它存在类中,而后你想要类的实例而且想让这个类依赖另外一个,另外一个等。service 容器的依赖注入能够为你保驾护航。你能够从容器中获取 services 而且它会本身处理 services 的全部依赖,给你带有其余实例的工做实例自动注入。
我关于这个库的描述并不涵盖它的全部潜能(你能够本身查看它的文档——有更多的特性可使用):你能够在定义 services 时给它命名,还能够定义构造器注入等。
一般我把个人 services 存放在 /services 文件夹。
TypeORM:使用 ORM 定义关系型实体,不一样列类型和不一样数据存储方案很是方便(关系型,非关系型)
这给个人感受就是,用 TypeScript 写 Node.js 最终有能力跟其余语言和 ORMS 竞争。
强大的 ORM 可让你很方便地用一种可理解的方式编写实体。我不是其余许多相似这种 Node.js ORMS 的粉丝:
module.exports = { id: SomeORM.Integer, name: SomeOrm.String({ …})}
复制代码
我老是想让实体写成类。被赋予类型的属性的类,会被带有简单装饰器的 ORM 发现。甚至是没有类型的。
TypeORM 给你这种能力。我项目中的另外一个例子:
如你所见,我甚至没在装饰器中写属性的类型(你能够这样作,不要担忧,明确地定义类型,默认的,可空的等)!TypeORM 为我作了全部这些工做,了解什么类型(感谢 TypeScript 反射:元数据扩展功能)以及把它应用在个人数据库。
它很是强大,你将拥有全部你在其余 ORMs 中拥有/看到的东西,好比(Doctrine, Hibernate)。
当使用 routing-controllers 和 TypeDI,它会为你注入实体管理器(就像你在个人 PlayerService 截图中看到的同样)提供很是有用的装饰器或者链接你的控制器和 services(这很是方便)。
这个 ORM 有一个涵盖了大量功能的官方文档,你能够看看而且从中了解全部你开始使用它须要了解的东西。
我一般把个人数据库配置放在 /config 文件夹,实体放在 /entities 文件夹。
这正是有趣的部分。
Routing-controllers 就像是你应用的地基。它给你轻松链接那两个库的可能(涵盖在库文档中)。固然,若是你不想的话能够不用。它能够和任何 ORM 一同使用。
可是,当你使用所有这三个库时,你会让框架对比其余解决方案时显得太过强大(至少对我来讲是这样)。你有控制器,参数注入,body 注入,参数验证,依赖注入,有了这些你能够忘掉手动提供依赖和定义类型,装饰属性的实体,查询 builder。这全都是靠 TypeScript!因此,后端也将有编译时类型检查!
好吧,这再简单不过了。你能够像平时同样写 typescript,配置它编译到 ES2015(node 如今有不少特性,不用把它编译成 ES2015 以前的版本了),使用 CommonJS 标准来实现模块便可。
而且使用 pm2 或其余东西在编译后启动 index/server/app.js 。基本上生产代码已经就绪。不用 ts-node 或者其余什么了。
若是你喜欢这些库,不要忘了表达你的喜好
如你所见,没有不少人知道 routing-controllers 和 TypeDI,这些是我 TypeScript Node.js 项目用到的最强大而且好用的库了。若是你喜欢它们,请花一秒钟 star 它们而且宣传一下。它们帮了我不少,因此我但愿它们能够帮到你和其余一样的 TypeScript 使用者!
这些库也有 gitter 社区,你能够经过谷歌搜索“gitter 库名”很方便地找到它们。
感谢阅读而且快乐地使用 TypeScript。欢迎评论或提问吧~
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。