使用 as const 进行 const 断言
将对象和数组冻结为深度 readonly 的字面量类型。
使用 as const 进行 const 断言 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
as const 断言
const 断言写作 as const,它会告诉 TypeScript 为某个值推断出最具体且深层的 readonly 类型。对象属性会变成字面量并且不可变;数组会变成只读元组。
const point = { x: 10, y: 20 } as const;
// type: { readonly x: 10; readonly y: 20 }
console.log(point.x, point.y);不使用 as const
不使用该断言时,对象属性会扩宽。{ x: 10 } 会被推断为 x: number,并且可以修改。请将其与前一个场景比较,看看 as const 做了哪些改变。
const a = { x: 10 }; // x: number, mutable
const b = { x: 10 } as const; // x: 10, readonly
a.x = 99; // allowed
console.log(a.x, b.x);将属性固定为字面量
as const 会将每个字符串属性转换为其字面量类型。对于键和值都必须保持精确的 config 对象,这一点非常有用。
const config = {
env: 'production',
retries: 3
} as const;
// env: 'production', retries: 3
console.log(config.env, config.retries);readonly 防止修改
由于 as const 会将属性设为 readonly,编译器会阻止重新赋值。该值在类型层面不可变,可以避免意外修改。
const settings = { mode: 'dark' } as const;
console.log(settings.mode);
// settings.mode = 'light'; // Error: readonly property对数组使用 const 断言
对数组应用 as const 会生成由字面量类型组成的只读元组。其长度固定,并且每个元素都会保留确切的值。
const colors = ['red', 'green', 'blue'] as const;
// type: readonly ['red', 'green', 'blue']
console.log(colors[0], colors.length);只读数组不可修改
只读元组会拒绝 push 等修改方法,也不允许通过索引赋值。数据会被锁定,这正是固定查找表所需要的行为。
const days = ['Mon', 'Tue', 'Wed'] as const;
console.log(days.join(', '));
// days.push('Thu'); // Error: push does not exist on readonly tuple使用 typeof arr[number] 推导联合类型
一种强大的模式是:获取一个 readonly 数组,并使用 typeof arr[number] 推导出其元素类型的联合。值只需写一遍,就能免费获得字面量联合类型。
const ROLES = ['admin', 'editor', 'viewer'] as const;
type Role = typeof ROLES[number];
// 'admin' | 'editor' | 'viewer'
const r: Role = 'editor';
console.log(r);单一事实来源
这样可以让运行时数组和类型保持同步。向数组添加一个值后,联合类型也会自动更新,无需维护重复的列表。
const SIZES = ['S', 'M', 'L', 'XL'] as const;
type Size = typeof SIZES[number];
function pick(s: Size): void {
console.log('Picked', s);
}
pick('M');对元组使用 const 断言
对于元素类型不同的元组,as const 会同时保留确切的类型和顺序,从而生成精确的只读元组。
const pair = [1, 'one'] as const;
// type: readonly [1, 'one']
console.log(pair[0], pair[1]);深层只读行为
as const 会深层地应用。嵌套的对象和数组也会变成带有字面量类型的只读结构,并一直作用到底层。
const data = {
name: 'app',
tags: ['a', 'b']
} as const;
// tags is readonly ['a', 'b']
console.log(data.name, data.tags[1]);使用 const 断言表示枚举
const 对象加上派生联合类型,是 enum 的一种轻量替代方案。您可以在运行时获得字面量值和精确类型,而且不会生成额外代码。
const Status = {
Idle: 'idle',
Active: 'active'
} as const;
type Status = typeof Status[keyof typeof Status];
const s: Status = Status.Active;
console.log(s);快速检查
测试您对 const 断言的理解。
回顾:as const
您已经学会了 as const 可以:
- 推断出最具体且深层的只读字面量类型。
- 将对象属性转换为字面量只读字段。
- 将数组转换为由字面量组成的只读元组。
- 通过
typeof arr[number]推导联合类型,让值和类型保持同步。
接下来,我们将组合字面量来表达更丰富的联合类型。
const LEVELS = ['low', 'mid', 'high'] as const;
type Level = typeof LEVELS[number];
const chosen: Level = 'mid';
console.log(chosen);常见问题解答
「使用 as const 进行 const 断言」课时是免费的吗?
是的 — 「使用 as const 进行 const 断言」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「使用 as const 进行 const 断言」这节课中我会学到什么?
将对象和数组冻结为深度 readonly 的字面量类型。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用 as const 进行 const 断言」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 字符串与数值字面量类型
- 布尔字面量与字面量推断
- 使用 as const 进行 const 断言
- 将字面量组合为联合类型