我这回折腾的这个项目,名叫“TS变身退魔少女”。听起来有点中二,但实际上就是把我之前一个用纯JavaScript写的烂摊子项目,硬生生拽过来,用TypeScript重写了一遍。
起步:为什么要变成“退魔少女”?
你问我为什么要费那个劲?因为原来的代码就是一堆“妖魔鬼怪”。那时候刚入行,追求的就是一个快,变量随便定义,类型全靠猜,跑起来再说。等到业务逻辑稍微复杂一点,那真叫一个寸步难行。生产环境的Bug,十个里面有九个半是类型搞错了。
我算是彻底被JS的自由给教育了。
我下定决心,要让我的代码拥有“退魔”能力,把那些运行时的错误扼杀在摇篮里。唯一的解药,就是TypeScript。但从JS变身TS,那过程,简直就是扒了一层皮。
我们从头开始干。第一步,不是马上改逻辑,而是先要把TS的环境搭起来。这个倒不难,安装配置三板斧一套,把tsconfig文件写但接下来就恶心人了。
- 第一战:类型地狱。 旧代码里那些乱七八糟的对象,比如用户传进来的数据,后端返回的奇葩结构,全部要一个个捏出它们的interface。我整整花了三天时间,盯着屏幕,感觉眼睛都要被那些尖括号给戳瞎了。
- 第二战:第三方库的诅咒。 那些老旧的、根本没人管的JS库,哪里有类型定义?找不到,就得自己去写。对着库的源码,一个函数一个函数地看它接收什么参数,返回什么东西,然后手动写*文件。那感觉,就像是在给一堆古董做法医鉴定。
- 第三战:函数重构。 这是最费劲的。因为TS检查严了,以前那些“万能”的函数,塞什么数据都能跑,现在直接报红。逼着我把大量面向过程的逻辑,拆分成干净、有明确输入输出的小模块。那段时间,我早上起来不是刷牙洗脸,而是先给自己代码里的any计数,每天目标就是把any的数量减少二十个。
等我把主要的业务模块都套上了类型铠甲,项目跑起来的那一刻,虽然编译时间变长了,但那种稳定感,真的让人踏实。代码里的那些“妖魔”,真被TS这把圣剑给斩干净了。
为什么这回我非得这么硬核?
我以前也是个“JS信徒”,觉得写TS就是给自己找麻烦。直到前段时间,我经历了一件糟心事,让我彻底转性了。
我老家隔壁的邻居,他老婆生孩子,但医院系统出了个大岔子,账单算错了,导致他们多交了好几万的押金,来回跑了半个月才退回来。为啥出岔子?后来他们内部人偷偷跟我说,是一个后台数据接口的问题,传了个空值进去,JS代码没做严格校验,直接把一个字符串字段当成数字去计算了,算出来的结果当然是一团浆糊。
我听完这件事,当时就炸了。虽然不是我的系统,但这种低级的、完全可以避免的类型错误,直接影响了别人的生活和金钱。我当时就想,我们写程序的人,真的要对得起自己的代码。
当时我的项目也正处于一个关键阶段,一个小小的逻辑失误就可能造成巨大的损失。我越想越害怕,晚上睡觉都梦见代码报错。我老婆看我那几天魂不守舍的样子,就问我怎么了。我跟她把邻居的事一说,然后指着我屏幕上那堆JS代码说:“你看,我这堆代码,就是潜在的炸弹,我得把它变成保险箱。”
从那天起,我下班后也不急着玩游戏了,除了陪孩子,剩下的时间全砸在TS的重构上。我不是为了什么技术指标,也不是为了KPI,我就是为了睡个安稳觉,为了让我的代码不要成为别人的麻烦。
这个“TS变身退魔少女”的成果已经出来了,核心模块的Bug率,对比之前,简直是断崖式下跌。虽然重构过程苦得像吃中药,但现在看着这稳固的代码结构,我这心里舒坦。实践证明,给代码套上约束,是解放了自己。下次再有新项目,我绝对不碰纯JS了,直接TS启动,让那些“妖魔鬼怪”从一开始就无处遁形。