前端知库

如何用可辨识联合避免不合理的状态组合?

把加载、成功、失败建模为互斥状态,并检查分支是否完整。

参考答案

多个独立布尔值容易组合出“正在加载但又成功又失败”的无效状态。可辨识联合用一个字面量字段区分分支,使每个分支只包含自身需要的数据。

TypeScript
type State<T> =
  | { status: "loading" }
  | { status: "success"; data: T }
  | { status: "error"; error: Error };

function read(state: State<string>) {
  if (state.status === "success") {
    return state.data;
  }
}

在 switch 中处理所有分支,并让默认分支的变量赋给 never,可在新增状态却漏写处理时得到类型错误。