背景

请求成功时才有 data,失败时才有 error。这种关联如果只靠可选字段表达,调用方很容易忘记判定状态。

核心判断

  1. 每个分支使用唯一字面量作为判别字段。
  2. switch 分支内使用对应数据,让编译器完成收窄。
  3. 用 never 做穷尽检查,新增状态时迫使消费者同步处理。

最小示例

下面保留核心逻辑;业务类型、调用入口和环境配置按项目补齐。

type Result<T> = { status: "loading" } | { status: "ok"; data: T } | { status: "failed"; error: Error };

边界与误区

可辨识联合只约束编译期代码,不能证明 HTTP 返回的 JSON 符合声明。不要在最后用类型断言绕过穷尽检查。

验证方式

增加一个 cancelled 状态,确认遗漏的消费者编译失败;边界输入单独做运行时校验,测试不合法状态与缺失字段。

小结

为每种状态定义唯一字面量字段,让编译器阻止 loading、error、data 的错误组合。