kind 可辨识联合
最后更新:2026-10-22
kind 可辨识联合
可辨识联合(也叫 tagged union)把一组类型用一个共同的判别字段(如 status、kind)串起来,每个成员的判别字段取不同的字面量值。switch 判别字段时,TS 自动收窄到对应成员——这是业务建模里最实用的联合类型用法。
| 分组 | 收窄与断言 |
|---|---|
| 类型 | 类型 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
type Result<T> =
| { status: "loading" }
| { status: "success"; data: T }
| { status: "error"; message: string };
function handle<T>(res: Result<T>) {
switch (res.status) {
case "loading": /* res: 无 data */ break;
case "success": res.data; break; // 收窄为 success 成员
case "error": res.message; break;
}
}
⚙️ 参数
| discriminant | 判别字段:每个成员都必须有该字段,且取值是互不相同的字面量类型(如 "loading" / "success" / "error") |
|---|
返回值:无返回值——可辨识联合是类型层建模手段;收窄效果由 switch/if 对判别字段的比较触发,编译期完成。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
loading…
got 3 items
error: timeout
(转译后运行输出;res.data 能在 success 分支通过类型检查,是因为判别字段收窄——由 tsc 静态保证,运行时只看到值)
💡 要点
ℹ️ 说明 判别字段没有命名限制,常见有 type、kind、status、state、tag;关键是每个成员取不同的字面量值,TS 才能唯一辨识。
⚠️ 注意 判别字段必须是必备的字面量类型。如果写成 string(而不是 "success" 这类字面量),或者标记为可选,辨识力就没了,收窄会失效。
💡 提示 可辨识联合与穷尽检查是黄金搭档:switch 所有判别值后,新增成员时编译器会指出所有遗漏的分支(配合 assertNever 使用,见 exhaustive-checks 条目)。
🏷️ 相关收窄与断言
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q 可辨识联合和普通联合类型有什么区别?
A 普通联合只能靠 typeof/in 这类通用检查收窄;可辨识联合多了一个字面量判别字段,switch 一个字段就能精确切到某个成员,还能做穷尽检查。能设计判别字段就优先用它。
Q 判别字段可以嵌套在对象里面吗?
A 可以,TS 支持对嵌套属性(甚至数组元素)的判别收窄,例如 res.meta.state。但嵌套越深可读性越差,惯例是把判别字段放顶层。
Q 用数字枚举当判别值可以吗?
A 可以。枚举成员(包括数字枚举)都是字面量类型,每个成员取不同枚举值即构成可辨识联合;字符串枚举比数字枚举调试时更易读。