as const as const 断言
最后更新:2026-10-22
as const as const 断言
as const 把整个字面量"冻结"成最深层的常量类型:所有属性变成 readonly,所有值收窄成字面量类型(字符串、数字、布尔),数组变成只读元组。它是"从常量表自动推导联合类型"这套经典模式的核心。
| 分组 | 收窄与断言 |
|---|---|
| 类型 | 操作符 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
const ROLES = ["admin", "editor", "viewer"] as const;
type Role = (typeof ROLES)[number]; // "admin" | "editor" | "viewer"
const THEME = { mode: "dark", fontSize: 14 } as const;
// { readonly mode: "dark"; readonly fontSize: 14 }
⚙️ 参数
| as const | 作用于字面量表达式:推断出最窄的只读字面量类型,而不是默认的宽类型(string、number、可变数组) |
|---|
返回值:无运行时效果——转译后 as const 完全消失;它只把编译期推断出的类型换成最窄的只读版本。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
admin/editor/viewer
role set to editor
dark 14
(转译后运行输出。setRole("editor") 能通过检查是因为 as const 让 Role 成为字面量联合——不写 as const 时 ROLES 会被推断为 string[],setRole("editor") 直接编译报错)
💡 要点
ℹ️ 说明 as const 是"深层"的:嵌套对象里的属性同样变 readonly 且收窄为字面量。这一点和 Readonly<T>(浅层)不同。
⚠️ 注意 as const 之后不能修改任何属性、不能对数组 push,编译期就报错。需要可变副本时用扩展运算符重建:{ ...DEFAULT_THEME, mode: "light" }。
💡 提示 经典组合:(typeof CONST)[number] 把 as const 数组变成字面量联合类型,常量表成了"单一事实来源"——加一个角色,类型自动跟上。
🏷️ 相关收窄与断言
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q const 变量和 as const 有什么区别?
A const 只锁"变量不能重新赋值",对象属性照样可改,类型推断照样是宽的(string);as const 把类型本身收窄成只读字面量。const 锁绑定,as const 锁类型。
Q 怎么从 as const 数组推导联合类型?
A 两步:typeof ARR 取数组类型,再用索引访问 [number] 取所有元素类型的联合:type Role = (typeof ROLES)[number]。这是官方推荐的模式,不需要手写两份清单。
Q 所有对象字面量都该加 as const 吗?
A 不该。适合的是"真正的常量":配置快照、枚举值表、action type;需要后续修改或由可变状态填充的对象不要加,否则处处遇到 readonly 报错,反而被迫再写一堆断言。