TypeScript没那么神,但它救过我家猫和半条命

凌晨2:47,滨江某产业园的消防通道台阶上,我屁股底下垫着半张皱巴巴的黄焖鸡外卖小票,手机屏幕亮着——是我家猫的实时监控。那货正扒着我桌上的机械键盘,把半杯凉透的冰美式扫到了地板上。

我回不去。

17分钟前,我们负责的小区智能门禁系统集体锁死,3栋楼的住户在业主群里刷了满屏的语音,骂声顺着5G信号飘到机房的时候,我正蹲在服务器前面,盯着满屏的报错日志,脑壳疼。

那堆没类型的JS,最后全成了埋在服务里的雷


说实话,我们团队从创业到现在,一直写原生JavaScript。总觉得小团队要的就是快,写个逻辑就上线,哪有那么多讲究?三个月前新来的实习生小宇提了一次,说要把核心服务迁到TypeScript,当时我拍着评审会的桌子笑,说“写个开门锁的逻辑,还要给用户权限定义个interface?纯纯脱裤子放屁”。

这次的bug说起来真的好笑。我们的开门权限接口,从创业第一天起就默认userType字段是字符串类型——管理员是”admin”,临时访客是”guest”,业主是”owner”。谁都没想着要给这个字段加个约束,毕竟JS是弱类型的,传啥都能跑。

上周为了修老年机开门慢的问题,我们把代码里所有的==全换成了===,就是想减少点隐式类型转换的性能损耗。结果今天上线之后,有个运营的同事在后台配置访客权限的时候,手滑把”guest”打成了数字1。

换之前的老逻辑,1和”guest”本来就不相等,会走默认锁死分支?不对,更离谱的是,有个老接口的权限字段默认值是null,之前的隐式转换会把null当成未配置的权限,直接放行,换了严格相等判断之后,null跟任何字符串都不严格相等,直接触发了最高级别的锁死逻辑。

未经过类型检查的JavaScript线上报错堆栈截图
未经过类型检查的JavaScript线上报错堆栈截图


我盯着日志翻了快两个小时,才发现三个不同的业务模块,都在往同一个权限字段里塞东西:一个传字符串,一个传数字,还有一个传null。没有任何统一的规则,全靠写代码的人自己记着“这里要传字符串哦”。

当时我那个脸烫的啊,消防通道的穿堂风刮得我耳朵疼,我想起三个月前喷小宇的时候说的话,真想给自己两巴掌。

TypeScript根本不是什么“类型约束”,是给代码装了个提前预警的烟雾报警器


就在我蹲在地上薅头发的时候,小宇默默把他电脑屏幕转了过来。是他上周偷偷写的TS版本的权限模块,满屏的interface,定义了每个用户类型的字段必须是什么值,每个接口的参数必须是什么类型。

他说,之前写这个版本的时候,只要谁传的参数不对,编辑器直接亮红杠,根本提交不了代码,连本地测试都跑不起来。

我当时突然就反应过来,之前我对TS的误解有多深。我总觉得TS是大公司搞出来的官僚主义规矩,是给代码套上的枷锁,写个东西还要先定义半天类型,太耽误效率。但实际上呢?

TS做的根本不是事后追责的约束,是事前的预警。就像你家里装的烟雾报警器,不是等火烧到沙发了才响,是刚飘第一缕烟的时候就叫,根本不用等你穿着睡衣从家里跑出来,打119等消防员来救火。

我们花了15分钟,把小宇写的TS版本的模块临时替换上去,门禁系统直接恢复正常。当时业主群里有人发了个拼手气红包,备注是“感谢修门禁的师傅们,我在楼下冻了20分钟”,我抢了0.37元,手指都在抖。

TypeScript编辑器中类型不匹配的红色报错提示截图
TypeScript编辑器中类型不匹配的红色报错提示截图


那天我在机房门口站着,看着楼上住户家里的灯一盏盏亮起来,突然就想起之前看到的一个新闻:有个做智能家居的小团队,因为JS的弱类型问题,把室温控制模块的26度参数传成了260度,直接把用户家的智能烤箱烧了个窟窿。当时我还在技术群里笑人家粗心,现在想想,我们跟那团队的区别,也就是运气好,没把人锁在门外一晚上而已。

那些骂TS麻烦的人,多半是没被线上bug追着跑过


不过话说回来,我们后来全团队把核心服务迁到TS的时候,确实慢了不少。之前写个新的门禁功能,一天就能上线,现在要先定义好每个接口的类型,要处理可选参数,要做类型守卫,大概要一天半。

一开始还有老同事吐槽,说“这不纯纯给自己找事吗”。结果上线跑了一个月,我们统计了一下线上bug的数量——之前平均每个版本要出12个线上问题,其中有7个是因为类型不匹配导致的。迁了TS之后,上个月的线上bug一共2个,还是因为运营的同事在后台传了个奇怪的字符串,TS总不能管人的手滑吧?

上周我们做新的小区充电桩功能,有个同事写充电费用计算接口的时候,本来应该传number类型的每度电价格,结果他手滑传了个带单位的字符串“1.2元/度”。代码刚敲完,编辑器直接红了一片,提示“参数类型不匹配,预期number,实际string”。

他当时还撇着嘴吐槽,说“至于吗,我不就是多打了几个字”。结果我们后来算了算,要是真把这个代码上线,JS会直接把字符串拼接到计算结果里,用户充10度电,账单会显示“1.2元/度15”,到时候客服电话估计要被打爆。

我现在也不会说TS是全世界最好的技术。毕竟有时候写个复杂的泛型,写半小时都通不过类型检查,我也会对着屏幕骂娘。但我再也不会说它是脱裤子放屁了。

昨天晚上我在家写代码,猫趴在我键盘旁边打盹。以前写JS的时候,我总怕哪个地方类型不对,每次写完都要把所有逻辑在脑子里过三遍,生怕哪个地方藏着个雷,经常熬到一两点才能睡觉。现在写TS,只要编辑器没红杠,我就敢把代码提交上去,十一点准时关电脑。猫跳上来踩了我两脚,把我桌上的鼠标扒到了地上,我笑着把它抱起来,突然就觉得,之前大家总说技术要追求快,要追求效率,但快的代价是什么?

是你要在凌晨三点蹲在机房的台阶上,是你家的猫在家等你等到把咖啡扫到地上,是楼下的邻居穿着睡衣在冷风里等你把门打开。

那些你在写代码的时候多花的十分钟,最后都会变成你可以早点回家撸猫的时间。

作者|大讲堂

排版|大讲堂

审核|柚子

免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。如有侵权请联系删除。
文章名称:TypeScript没那么神,但它救过我家猫和半条命
文章链接:https://www.lfdjt.com/info_23_25672.html