最近在做运营侧中台项目的重构,目前的选型是 koa2+typescript。在实际生产中,切实体会到了 typescript 类型带来的好处。
为了更形象说明 typescript 的优势,还是先来看一个场景吧:
BUG 现场
作为一门灵活度特别大的语言,坏处就是:复杂逻辑编写过程中,数据结构信息可能由于逻辑复杂、人员变更等情况而丢失,从而写出来的代码含有隐含错误。
比如这次我在给自己的博客编写node 脚本的时候就遇到了这种情况:
const result = [];
function findAllFiles(root) {
const files = fs.readdirSync(root);
files.forEach(name => {
const file = path.resolve(root, name);
if (isFolder(file)) {
findAllFiles(file);
} else {
result.push({
path: file,
check: false,
content: fs.readFileSync(file)
});
}
});
}
result 保存了递归遍历的所有文件的 path、check、content 信息,其中 content 信息会被传给prettier.js的check(content: string, options: object)方法。
显然,上述代码是有错误的,但是极难发现。只有运行它的时候,才能通过堆栈报错来进行定位。但如果借助 ts,就可以立即发现错误,保持代码稳健。
这个问题放在文章最后再说,下面看看 ts 在 koa 项目中的运用吧。
项目目录
由于没有历史包袱,整个项目的架构还是非常清爽的。如下所示:
.
├── README.md
├── bin # 存放scripts的脚本文件
├── dist # 编译打包后的js文件
├── docs # 详细文档
├── package.json # npm
├── sh # pm2等脚本
├── src # 项目源码
├── tmp # 存放临时文件的地方
└── tsconfig.json # typescript编译配置
typescript 编译与 npm 配置
因为是用 ts 来编写代码,因此需要专门编写 typescript 的配置文件:tsconfig.json。根据个人习惯,以及之前组内的 ts 项目,配置如下:
{
"compilerOptions": {
"module": "commonjs", // 编译生成的模块系统代码
"target": "es2017", // 指定ecmascript的目标版本
"noImplicitAny": true, //