有一种说法是 9102 年做 Node 后台开发还不上 Typescript 不是太懒惰就是太菜了,其实假如你使用 Egg.js, 他们已经对基于 ts 开发做了许多支持,在项目里引入 ts 并没有那么困难,且对减少开发过程中的低级错误非常有帮助。
在这里记录一下个人在 Egg.js 项目里引入 ts 的一些约定,其实都在官方文档、文章和 Github issue 里了。
从 JS 迁移到 TS
web 开发不是瀑布流,定了需求闭门开发几个月上线,往往是基于线上运行的 js 项目,要改造成基于 ts,前提是不能中断服务,初步设想有以下三种方案:
逐步替换文件,.js 和 .ts 后缀文件并存,通过 .d.ts 文件来标明类型获取提示;
分成 js base 和 ts base 两个项目,逐步替换接口,新接口完成并通过测试后,流量切换到新项目;
直接做项目全量文件的 ts 化,利用 any 类型先完成迁移,后期再逐步以【用到了就重构】的原则重构所有代码。
第一种方式在定义 .d.ts 文件时非常繁琐且会有一些坑,如很难推断函数返回类型,且在使用一些 es 原生方法时覆盖类型会有坑;
第二种方式需要实现一种流量切换的方式,如加入 haproxy 中间层,通过 header 或是 path 等方式来识别新老接口流量。碰到的主要问题是在新老项目一个服务往往要改动多个公共文件,很难保持同步,会有矛盾发生;
第三种方式是最后采用的方式,从 js 代码中切出一个新分支,写了脚本批量替换文件后缀,花了大约 2-3 天完成迁移,期