A | B 联合类型
最后更新:2026-10-22
A | B 联合类型
联合类型 A | B 表示"值是 A 或 B 之一"。使用联合值前必须先收窄(typeof、in 等),编译器才知道当前面对的是哪一种。
| 分组 | 类型组合 |
|---|---|
| 类型 | 类型 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
type Id = string | number;
let id: Id = "u1";
id = 42; // 两种都合法
if (typeof id === "number") {
id.toFixed(0); // 收窄后才有成员方法可用
}
⚙️ 参数
| A | B | 竖线分隔成员类型,成员数量不限,重复成员会被自动合并 |
|---|
返回值:无返回值——联合类型是纯类型层概念,编译后消失。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
ABC 3.14
(转译后运行输出;不在 if 里收窄直接调 value.toUpperCase() 会得到编译错误)
💡 要点
ℹ️ 说明 未收窄的联合值只能访问所有成员共有的属性/方法——编译器无法确定当前是哪一种。
💡 提示 收窄手段按场景选:typeof(原始值)、in(属性存在)、instanceof(类实例)、字面量相等(判别联合)。
⚠️ 注意 联合分支过多会让每个使用点都写收窄,维护成本高;带公共标签字段的分支考虑改成判别联合。
🏷️ 相关类型组合
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q 为什么必须收窄才能用方法?
A string | number 上调用 toUpperCase:如果运行时是 number 就会崩。编译器要求你先证明"当前是 string",收窄就是这个证明过程。
Q 联合类型和 any 的区别?
A 联合明确列出"允许的几种可能",用错范围外直接报错;any 允许一切且失去所有检查。联合是"有限的选择",any 是"放弃判断"。
Q 什么是可辨识联合?
A 每个分支带一个字面量字段(如 kind: "circle" | "rect"),switch 该字段即可一次收窄整个对象。详见 discriminated-unions 条目。