TypeScript 中的 strictNullChecks
说明 strictNullChecks 为什么让 null 和 undefined 拥有独立类型,以及它为什么是 TypeScript 严格模式里最关键的开关之一。
#tech / dev
#resource / typescript
#type / concept
#status / growing
[!info] related notes
- 所属 MOC: TypeScript MOC
- 配置入口: tsconfig 使用详解
- 并列概念: TypeScript 中的 strict, TypeScript 类型检查, TypeScript 中的 noUncheckedIndexedAccess
TypeScript 中的 strictNullChecks
一句话定义
strictNullChecks 会让 null 和 undefined 不再被默认为“可以塞进任何类型里”。
核心机制 / 工作原理
官方文档明确说明:
- 当它为
false时,null和undefined会被语言基本忽略 - 当它为
true时,它们拥有各自独立的类型
这直接改变很多 API 返回值和控制流推断。
官方文档的典型例子是:
const loggedInUser = users.find((u) => u.name === loggedInUsername);
console.log(loggedInUser.age);
在 strictNullChecks: true 下,find 的结果会是:
User | undefined
所以对 age 的直接访问会报错。
最小例子 / 最小场景
{
"compilerOptions": {
"strictNullChecks": true
}
}
这通常会让你开始显式处理:
- 查找失败
- 可空输入
- 可能缺席的值
边界与易混淆点
它是 TypeScript 严格性的基石之一
很多其他严格选项的价值,都是建立在“undefined 真的会出现在类型里”这个前提上。
它不只是多报错,而是改变 API 类型面貌
一旦开启,标准库和常见方法的返回类型也会随之更真实。
它经常被视为最重要的严格开关之一
TypeScript 官方基础文档里也特别强调:
noImplicitAnystrictNullChecks
是最值得先理解的两项严格性开关。
参考信息
- TSConfig
strictNullChecks: https://www.typescriptlang.org/tsconfig/strictNullChecks.html - TypeScript Basics: https://www.typescriptlang.org/docs/handbook/2/basic-types.html