楼主将TS的strict mode比作高考备考,这个隐喻颇具启发性,但从认知心理学角度看,值得商榷的是"规范化的约束最终提升鲁棒性"这一因果链条。在我的经验里,约束的价值并非源于道德意义上的"自律",而在于降低决策疲劳(decision fatigue)——这与我去年在温哥华接手这家咖啡店的经历颇为相似。
严格来说
之前在国内互联网大厂做前端时,我们团队有完整的SRE支持和三轮code review流程,启用strict mode确实将defect density压低了约30%(内部数据,样本量n≈12,000 commits)。但当我被lay off后独自运营这家咖啡店,同时维护店里的React Native点单系统和库存管理脚本时,情况发生了微妙的变化。此时我面临的是典型的资源约束下的优化问题:每天的cognitive budget有限,如果花在纠结TypeScript的泛型约束和conditional types上,就意味着减少与本地roaster谈判或研发新品的时间。
这里涉及一个常被忽视的经济学视角:shift-left的边际成本在团队规模曲线上并非线性。对于楼主主导的大型项目,strict mode的固定投入可以被多人分摊,且早期约束确实能避免指数级增长的技术债务;但对于solo developer或初创公司的MVP阶段,我们需要的是"差异化严格"而非global的strict配置。就像我店里做Texas-style BBQ——低温慢烤的brisket必须严格控温(相当于核心支付模块的strictNullChecks),但sides like coleslaw的调味完全可以灵活调整。
具体而言,我建议采用type coverage作为连续变量替代binary的strict模式。根据我在店里实际项目的observation,将type coverage维持在85%-90%的sweet spot,其ROI远高于追求100% strict。我使用type-coverage npm包配合GitHub Actions监控,对核心业务逻辑(支付、库存、会员系统)启用strictNullChecks和noImplicitAny,且要求coverage≥95%;而对临时的数据迁移脚本、内部admin dashboard或实验性的UI组件,允许存在explicit any,只要整体coverage不低于60%即可。
这种做法的value proposition在于:它保留了类型系统对关键路径的防御能力,同时避免了在rapidly evolving的业务逻辑上过度投资类型体操。严格来说crypto_q提到的渐进式策略我深表赞同,但想补充具体的实施细节——不是简单地从loose到strict的二元切换,而是建立"类型债务账本",就像会计里的depreciation schedule,允许在特定sprint内累积技术债务,但必须有明确的amortization plan。
btw,关于微软2017年那项研究,除了darwin26和logic_cn提到的selection bias外,其测量维度也值得商榷——该研究主要追踪的是"编译期可预防缺陷",却未量化测量开发velocity的衰减。在我的咖啡店系统重构项目中,强制启用strict mode确实将production bug从每月3-4个降至接近0,但也导致新功能上线延迟了两周。对于small business语境,这两周的opportunity cost(错过万圣节促销季)可能远高于后期修复一个runtime type error的成本。
所以回答楼主关于threshold的问题:我的策略不是设置单一的strictness level,而是采用domain-driven的type safety策略。Entity层和State management必须铁律如山,UI presentation layer则可以pragmatic一些。毕竟,在温哥华这个 rainy city,与其在类型体操里追求完美,不如早点写完代码去Stanley Park露营