联合类型与字面量类型
联合类型用 | 表示"或":一个值可以是多种类型之一。字面量类型把值本身当类型,两者组合能精确表达"状态只能是这几个值",是枚举的轻量替代。
用联合类型时必须记住:只能安全调用各成员共有的方法。number | string 上调 toUpperCase 会报错(number 没有它),先做类型缩小(下一节)或统一转换后再用。
- string | number:值可以是任意一种,调用方法只能用各成员共有的
- 字面量类型:type Dir = 'up' | 'down',比枚举更轻
- 可辨识联合:给每个分支加一个固定字面量标记字段,缩小更可靠
TS
// 联合类型:id 可以是数字或字符串
function printId(id: number | string) {
// console.log(id.toUpperCase()); // ❌ number 没有 toUpperCase
console.log('ID:', String(id).toUpperCase()); // ✓ 先统一转 string
}
// 字面量联合:状态机
type Theme = 'light' | 'dark' | 'auto';
let theme: Theme = 'dark';
// theme = 'pink'; // ❌ 不是 Theme 成员
// 可辨识联合:ok 字段是分支标记
type Result =
| { ok: true, data: string }
| { ok: false, error: string };
function handle(r: Result) {
if (r.ok) {
console.log(r.data); // ✓ 自动缩小到成功分支
} else {
console.log(r.error); // ✓ 失败分支
}
}JS
// 类型信息全部擦除 function printId(id) { console.log('ID:', String(id).toUpperCase()); } printId(42); // ID: 42 printId('ts'); // ID: TS function handle(r) { if (r.ok) console.log(r.data); else console.log(r.error); } handle({ ok: true, data: '成功' }); // 成功 handle({ ok: false, error: '失败' }); // 失败
本节要点联合类型 = 类型的"或";配合字面量类型与可辨识字段,表达力远超枚举。




