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 形状错误,断言仍会通过编译。它适合编译器确实无法推断、而开发者掌握额外证据的窄边界,不适合给外部数据“盖章”。
选择顺序
- 先让控制流自然推断和收窄。
- 需要检查配置形状并保留具体类型时用
satisfies。 - 需要生成字面量联合时用
as const。 - 只有真实证据无法被类型系统表达时才用
as,并把范围压到最小。
常见误解
as const不是深度运行时不可变。satisfies不是类型注解,也不会改变运行时值。- 双重断言
as unknown as T通常是在绕过兼容性保护。