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 报错,反而被迫再写一堆断言。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏