0Pricing
TypeScript Academy · 课时

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 字符串与数值字面量类型
  2. 布尔字面量与字面量推断
  3. 使用 as const 进行 const 断言
  4. 将字面量组合为联合类型
← 返回 TypeScript Academy