TypeScript 中的 exactOptionalPropertyTypes
说明 exactOptionalPropertyTypes 如何让可选属性严格区分“不存在”和“值为 undefined”,以及它为什么会改变对象建模语义。
#tech / dev
#resource / typescript
#type / concept
#status / growing
[!info] related notes
- 所属 MOC: TypeScript MOC
- 配置入口: tsconfig 使用详解
- 并列概念: TypeScript 中的 strict, TypeScript 类型检查
TypeScript 中的 exactOptionalPropertyTypes
一句话定义
exactOptionalPropertyTypes 会让 TypeScript 更严格地区分:
- 属性根本不存在
- 属性存在,但值是
undefined
核心机制 / 工作原理
官方文档说明,开启它后,TypeScript 会对带 ? 的可选属性应用更严格的规则。
例如:
interface UserDefaults {
colorThemeOverride?: "dark" | "light";
}
默认情况下,TypeScript 往往还会接受:
settings.colorThemeOverride = undefined;
但开启:
{
"compilerOptions": {
"exactOptionalPropertyTypes": true
}
}
后,官方文档明确说明,这种赋值会报错,因为:
undefined不等于“这个属性不存在”
最小例子 / 最小场景
它最典型的价值就在对象建模里:
- 可选字段真的表示“可以缺席”
- 而不是“默认还可以显式写成
undefined”
这会影响:
- 配置对象
- DTO
- patch/update 输入结构
边界与易混淆点
它不只是“更严格”,而是语义更准确
官方文档专门强调,像:
"key" in obj
这样的运行时检查,会把“属性缺失”和“属性值为 undefined”区分开来。
所以这个选项修正的是对象语义建模,而不只是额外挑刺。
它经常和 strict 一起出现
TypeScript 的 TSConfig 总参考页当前写明:
- 默认在
strict下为true
所以很多项目是升级到更严格配置后才第一次感受到它。
如果你真的想允许 undefined,就该把它写进类型里
也就是显式写成:
foo?: T | undefined
而不是依赖默认宽松解释。
参考信息
- TSConfig
exactOptionalPropertyTypes: https://www.typescriptlang.org/tsconfig/exactOptionalPropertyTypes.html - TSConfig Reference: https://www.typescriptlang.org/tsconfig/