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; // ✓
}
老项目渐进开启
- 先开 noImplicitAny、noImplicitThis(报错少);
- strictPropertyInitialization(类多的项目工作量中等);
- strictNullChecks 最后——报错量最大,按模块推进或配 // @ts-expect-error 临时豁免(可搜索回收);
- 全部子项开启后合并为 strict: true。
常见问题(FAQ)
Q:strict 会让开发变慢吗?
短期:多写空值处理;长期:调试时间大幅下降。业界共识:strict 项目的总成本更低。
Q:可以 strict: true 但关某个子项吗?
可以(strict 开启后单独覆盖 "strictNullChecks": false)——但每项关闭都是类型安全的破洞,记录技术债。
Q:新框架模板默认 strict 吗?
主流脚手架(create-next-app 等)已默认 strict: true——这是生态共识的确立。
参考文档
本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。