TypeScript 可辨识联合:让状态分支和数据绑定
背景 请求成功时才有 data,失败时才有 error。这种关联如果只靠可选字段表达,调用方很容易忘记判定状态。 核心判断 每个分支使用唯一字面量作为判别字段。 switch 分支内使用对应数据,让编译器完成收窄。 用 never 做穷尽检查,新增状态时迫使消费者同步处理。 最小示例 下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。 type Result<T> = { status: "loading" } | { status: "ok"; data: T } | { status: "failed"; error: Error }; 边界与误区 可辨识联合只约束编译期代码,不能证明 HTTP 返回的 JSON 符合声明。不要在最后用类型断言绕过穷尽检查。 验证方式 增加一个 cancelled 状态,确认遗漏的消费者编译失败;边界输入单独做运行时校验,测试不合法状态与缺失字段。 小结 为每种状态定义唯一字面量字段,让编译器阻止 loading、error、data 的错误组合。