TypeScript 的 as const、satisfies 与类型断言

区分 as const 的字面量保留、satisfies 的兼容性检查和 as 类型断言的信任边界。

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

[!info] related notes

TypeScript 的 as const、satisfies 与类型断言

三者解决的问题不同

as const

保留最窄的字面量类型,并把对象和数组属性视为只读:

const phases = ['collecting', 'diagnosing'] as const;
type Phase = (typeof phases)[number];

它不会冻结运行时对象,只影响静态类型。

satisfies

检查表达式是否满足目标类型,同时尽量保留表达式自身的精确信息:

const labels = {
  collecting: '收集中',
  diagnosing: '诊断中',
} satisfies Record<Phase, string>;

遗漏键或拼错键会报错,labels 仍保留具体键。

as Type

告诉编译器“请信任我把它当作 Type”,但不执行任何运行时检查:

const event = JSON.parse(raw) as StreamEvent;

如果 JSON 形状错误,断言仍会通过编译。它适合编译器确实无法推断、而开发者掌握额外证据的窄边界,不适合给外部数据“盖章”。

选择顺序

  1. 先让控制流自然推断和收窄。
  2. 需要检查配置形状并保留具体类型时用 satisfies
  3. 需要生成字面量联合时用 as const
  4. 只有真实证据无法被类型系统表达时才用 as,并把范围压到最小。

常见误解

  • as const 不是深度运行时不可变。
  • satisfies 不是类型注解,也不会改变运行时值。
  • 双重断言 as unknown as T 通常是在绕过兼容性保护。
创建于 2026/7/29 更新于 2026/7/29