-
从纯 JavaScript 弱类型思维写一个四十多万行的大型前端应用一个值是什么类型全靠脑子记和运行时碰运气、后端某天把商品详情接口的 promotion 字段从对象悄悄改成 null 前端一处直接写 data.promotion.discount 因没有任何静态类型守护一路潜伏到线上、大促当天某个无促销商品被打开时取到 null.discount 整个核心导购详情页白屏二十多分钟转化全没而编译期对此毫无征兆 + 项目里 any 遍地标了一堆类型却因一个 any 参数把类型错误一路带穿最终在运行时炸开类型系统形同虚设 + null 和 undefined 能赋给任意类型类型上完全看不出 user.profile.address.city 链式访问任一环为空就运行时抛 Cannot read properties of undefined 这前端最阴魂不散的崩溃全靠运行时某条数据走到才爆 + 同一个 User 结构在创建接口更新接口列表组件里手写重复定义十几遍彼此独立改一处其余全漂移漂移的类型反而给出误导性的假安全 + 盲目信任 API 响应用 as 强标类型运行时被完全擦除零校验后端一改字段脱节数据带病流入系统深处到犄角旮旯才炸 + 处理支付结果多状态用一串 if else 手判分支某天新增 refunded 状态漏补一处编译照常通过线上退款返回 undefined 悄悄走错逻辑无人察觉 + 一遇编译器报错就用 as 强转或 @ts-ignore 把红色报错强行消音真实的类型矛盾被放行从编译期看得见的报错变回运行时看不见的雷 + 订单状态用裸魔法字符串到处写把 shipped 敲成 shippd 编译器毫不知情那段逻辑永远走不到成隐形 bug → 2026 现代严格 TypeScript 全量迁移让类型错误在编译期就被拦下 + 开启 strict 严格模式用 noImplicitAny 堵死隐式 any 外部数据一律 unknown 加收窄 + 开启 strictNullChecks 把可空写进类型用可选链 ?. 和空值合并 ?? 逼你安全处理空值 + 用工具类型 Partial Omit Pick 从单一 User 源头派生所有变体改一处全自动同步杜绝漂移 + 在所有外部边界用 zod 做运行时校验并用 z.infer 让类型与校验同出一源非经验证不得入内 + 用可辨识联合加 never 穷尽检查让漏一个分支编译期就报错 + 用 typeof instanceof in 和类型谓词这样的类型守卫真实检查正确收窄取代 as 强转 + 用 as const 加字面量联合类型把取值集合纳入编译期管控敲错即报错 87 天战役复盘:47 套工程修法 + 7 个 P0 复盘 + 6 条工程哲学
7 人的前端团队 87 天把一套支撑公司核心电商业务、用纯 JavaScript 写了六年、从当年几千行的小项目长成四十多万行 any 遍地 undefined 满天飞谁也不敢深碰的大型 SPA 加 Node BFF 应用,系统性地全量迁移到严格 TypeScript——把我们彻底打醒的是一次大促当天的白屏事故,后端某天把商品详情接口的 promotion 字段从一个对象悄悄改成了 null,而前…- 0
- 0
TS
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!

