TypeScript strict 模式详解

strict 是 TS 最重要编译选项:一组严格检查的总开关。本文逐一讲解 8 个子选项、可空类型处理与老项目渐进开启路径。

最佳实践
类型结构与组件组合插画

新项目必须 "strict": true——它打包开启 noImplicitAny、strictNullChecks 等 8 项检查,把 TS 从"类型标注工具"变成"缺陷拦截系统"。老项目按子选项渐进开启,strictNullChecks 收益最大也最难,放最后。

strict 包含什么

{ "compilerOptions": { "strict": true } }

一键开启的检查家族:

子选项 拦截的错误
noImplicitAny 隐式 any(参数忘了标类型)
strictNullChecks null/undefined 未处理
strictFunctionTypes 函数参数逆变检查
strictBindCallApply bind/call 参数检查
strictPropertyInitialization 类属性未初始化
noImplicitThis this 隐式 any
alwaysStrict 严格模式语义
useUnknownInCatchVariables catch 变量为 公开资料未说明

strictNullChecks:皇冠上的明珠

开启前:string 实际可能是 null——所有类型标注都是谎言;开启后:可空必须显式(string | null),处理缺失值成为编译义务。这一项拦截了 JS 最高频的生产错误。

// strictNullChecks 下
function getLength(s: string | null): number {
  return s.length;        // 编译错误:s 可能是 null
  return s?.length ?? 0;  // ✓
}

老项目渐进开启

  1. 先开 noImplicitAny、noImplicitThis(报错少);
  2. strictPropertyInitialization(类多的项目工作量中等);
  3. strictNullChecks 最后——报错量最大,按模块推进或配 // @ts-expect-error 临时豁免(可搜索回收);
  4. 全部子项开启后合并为 strict: true。

常见问题(FAQ)

Q:strict 会让开发变慢吗?

短期:多写空值处理;长期:调试时间大幅下降。业界共识:strict 项目的总成本更低。

Q:可以 strict: true 但关某个子项吗?

可以(strict 开启后单独覆盖 "strictNullChecks": false)——但每项关闭都是类型安全的破洞,记录技术债。

Q:新框架模板默认 strict 吗?

主流脚手架(create-next-app 等)已默认 strict: true——这是生态共识的确立。


参考文档

本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台