| 表示"或":一个值可以是多种类型之一。字面量类型把值本身当类型,两者组合能精确表达"状态只能是这"> | 表示"或":一个值可以是多种类型之一。字面量类型把值本身当类型,两者组合能精确表达"状态只能是这"> | 表示"或":一个值可以是多种类型之一。字面量类型把值本身当类型,两者组合能精确表达"状态只能是这">
TypeScript 词条目录
前端Wiki/TypeScript/进阶/联合与交叉类型

联合类型与字面量类型

联合类型用 | 表示"或":一个值可以是多种类型之一。字面量类型把值本身当类型,两者组合能精确表达"状态只能是这几个值",是枚举的轻量替代。

用联合类型时必须记住:只能安全调用各成员共有的方法。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: '失败' });    // 失败
本节要点联合类型 = 类型的"或";配合字面量类型与可辨识字段,表达力远超枚举。
🔗 相关词条JavaScriptCSS3React