TypeScript 中的 exactOptionalPropertyTypes

说明 exactOptionalPropertyTypes 如何让可选属性严格区分“不存在”和“值为 undefined”,以及它为什么会改变对象建模语义。

#tech / dev #resource / typescript #type / concept #status / growing

[!info] related notes

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

而不是依赖默认宽松解释。

参考信息

创建于 2026/5/15 更新于 2026/5/27