TypeScript 技巧:使用语义化时间告别“毫秒 vs 秒”的单位换算烦恼
摘要
为了解决不同API对时间单位的不一致性问题,利用TypeScript的模板字面量类型构建了一套语义化时间系统。核心实现包括一个通用的毫秒解析器和一个将时间字符串转换为秒的函数。通过引入Duration类型和ms解析器,获得了三个好处:消除歧义、类型安全和心智解脱。这种方法使得代码更易读、更易维护,并减少了由于时间单位不一致引起的Bug。
每个 API 都有自己的脾气。setTimeout 用毫秒,Redis TTL 通常用秒,JWT 过期时间也是秒,但某些数据库的时间戳又是毫秒。这种不一致性不仅增加了心智负担,还极其容易引发 Bug(比如把 10 秒当成 10 毫秒,或者反过来)。
与其每次写代码时都在心里做乘除法,不如利用 TypeScript 的模板字面量类型,构建一套语义化时间系统。
1. 核心实现:通用的 ms 解析器
TypeScript
2. 举个栗子
TypeScript
使用了语义化类型后,代码的可读性和维护性瞬间提升:
TypeScript
总结
通过引入 Duration 类型和 ms 解析器,我们获得了三个好处:
消除歧义:不再需要猜测
86400到底是秒还是毫秒。类型安全:TypeScript 会阻止你传入
"10 lightyears"这种非法单位。心智解脱:写代码时想到“10分钟”,直接写
"10m",不用在脑子里做10 * 60 * 1000的算术题。
///相关阅读