2026 年,TypeScript 的采用几乎是普遍的。有趣的问题不再是"我们应该使用 TypeScript 吗?" 而是"我们用得好吗?"本指南涵盖防止整类运行时 bug(不仅仅是类型错误)的模式。
严格模式:不可谈判的基准线
在 tsconfig.json 中启用所有严格检查:strict: true、noUncheckedIndexedAccess: true、exactOptionalPropertyTypes: true。noUncheckedIndexedAccess 在数组索引结果中添加 undefined—— 防止数组为空时 arr[0].name 崩溃。
用可辨识联合类型代替布尔标志
布尔标志会创建指数级增长的状态组合。有 3 个布尔值的组件有 8 种可能状态——大多数无效。 改用可辨识联合类型建模状态。TypeScript 在 status 的 switch 中缩小类型,防止在错误状态下意外访问 data。
satisfies 运算符
satisfies 在保留字面量类型以便进一步推断的同时,验证值是否符合类型。 当你想要类型检查但不想失去字面量推断精度时使用。
安全字符串 API 的模板字面量类型
模板字面量类型可以将字符串约束为特定模式。与映射类型结合,可以构建在编译时强制命名规范的 安全事件发射器、CSS-in-JS API 和路由工具。
领域建模的品牌类型
TypeScript 的结构类型使得具有相同形状的两种类型可以互换。品牌类型添加唯一的名义品牌以 防止意外互换。防止将产品 ID 传给需要用户 ID 的地方——结构上都是字符串,但语义不同。
避免类型断言,使用类型守卫
类型断言(as SomeType)完全绕过类型检查器。用实际在运行时验证类型的类型守卫 函数替代。在 unknown 数据到达的 API 边界处必不可少。