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 可以。枚举成员(包括数字枚举)都是字面量类型,每个成员取不同枚举值即构成可辨识联合;字符串枚举比数字枚举调试时更易读。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏