将字面量组合为联合类型
通过合并字面量类型,构建有限的值集合。
将字面量组合为联合类型 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
字面量类型的联合
字面量联合用于表示一个值必须恰好是若干个已知选项中的一个。它是状态机、枚举和类型完善的 API 的基础。
type Status = 'idle' | 'loading' | 'success' | 'error';
let state: Status = 'idle';
state = 'loading';
console.log('State:', state);对字面量联合使用 switch
对字面量联合使用 switch,代码清晰易读,并且编译器知道每个分支都是允许值中的一个。这与穷尽性检查非常契合。
type Status = 'idle' | 'loading' | 'done';
function label(s: Status): string {
switch (s) {
case 'idle': return 'Waiting';
case 'loading': return 'Working';
case 'done': return 'Finished';
}
}
console.log(label('loading'));穷尽式处理
处理联合类型的每个成员称为穷尽式处理。当覆盖所有情况后,TypeScript 可以证明函数始终会返回,不会遗漏任何分支。
type Dir = 'left' | 'right';
function step(d: Dir): number {
if (d === 'left') return -1;
return 1; // only 'right' remains
}
console.log(step('left'), step('right'));使用 never 进行穷尽性检查
在默认分支中将值赋给 never,可以确保:如果新增联合成员却忘记处理它,就会触发编译错误。这是应对代码演进的一道安全防线。
type Shape = 'circle' | 'square';
function area(s: Shape): string {
switch (s) {
case 'circle': return 'pi r^2';
case 'square': return 'a^2';
default:
const _exhaustive: never = s;
return _exhaustive;
}
}
console.log(area('circle'));从 const 对象推导联合类型
一种常见模式是将值保存在 const 对象中,然后使用 typeof obj[keyof typeof obj] 从这些值推导联合类型。一个事实来源,产生两种结果。
const Colors = { Red: 'red', Blue: 'blue' } as const;
type Color = typeof Colors[keyof typeof Colors];
// 'red' | 'blue'
const c: Color = Colors.Blue;
console.log(c);从键推导联合类型
您也可以使用 keyof typeof obj 推导出键的联合类型。当键本身就是有意义的标识符时,这非常有用。
const ICONS = { home: 0, search: 1, profile: 2 } as const;
type IconName = keyof typeof ICONS;
// 'home' | 'search' | 'profile'
const name: IconName = 'search';
console.log(name, ICONS[name]);使用字面量标签构建可辨识联合
为每个对象变体附加一个字面量标签属性,TypeScript 就可以区分它们。检查该标签后,类型会缩小为确切的结构。
type Action =
| { type: 'add'; amount: number }
| { type: 'reset' };
function reduce(a: Action): number {
if (a.type === 'add') return a.amount;
return 0;
}
console.log(reduce({ type: 'add', amount: 5 }));按判别字段缩小类型
测试字面量判别字段后,编译器就知道您拥有哪种变体,因此可以安全地访问其特有字段,而无需类型转换。
type Event =
| { kind: 'click'; x: number; y: number }
| { kind: 'key'; code: string };
function handle(e: Event): string {
if (e.kind === 'key') return 'Key ' + e.code;
return 'Click ' + e.x + ',' + e.y;
}
console.log(handle({ kind: 'key', code: 'Esc' }));组合多个联合类型
您可以从较小的具名联合类型组合出更大的联合类型。这样可以将相关选项分组,并在整个代码库中重复使用。
type Primary = 'red' | 'blue' | 'yellow';
type Secondary = 'green' | 'orange';
type Color = Primary | Secondary;
const c: Color = 'green';
console.log(c);将联合类型作为函数约束
将字面量联合类型传给函数,可以将调用者限制为有效选项,并提供编辑器自动补全。安全性与可发现性的结合很难被超越。
type Align = 'left' | 'center' | 'right';
function setAlign(a: Align): void {
console.log('Aligned', a);
}
setAlign('center');
// setAlign('top'); // Error字面量联合为何优于字符串
使用普通的 string 参数会接受任何值,包括拼写错误。字面量联合会在编译时捕获错误,并记录有效选项,为易维护的代码带来明显改进。
type Method = 'GET' | 'POST' | 'PUT' | 'DELETE';
function request(m: Method, url: string): void {
console.log(m, url);
}
request('POST', '/api/users');快速检查
测试您对字面量联合的理解。
回顾:组合字面量
您已经学会了:
- 为有限的选项集合构建字面量联合。
- 使用
never技巧进行穷尽式处理,提升安全性。 - 通过
keyof typeof和typeof obj[keyof typeof obj]从 const 对象推导联合类型。 - 使用字面量标签属性区分不同变体。
下一课程:特殊的 unknown、never 和 void 类型。
const ROUTES = { home: '/', about: '/about' } as const;
type Route = typeof ROUTES[keyof typeof ROUTES];
const r: Route = '/about';
console.log(r);用 AI 导师学习 TypeScript — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 101
- 课程
- 352
常见问题解答
「将字面量组合为联合类型」课时是免费的吗?
是的 — 「将字面量组合为联合类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「将字面量组合为联合类型」这节课中我会学到什么?
通过合并字面量类型,构建有限的值集合。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「将字面量组合为联合类型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。