You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何定义包含管理员身份信息的AuthStatus授权状态类型

你可以使用 TypeScript 的可辨识联合类型实现状态的精准约束,完全避免非法状态组合,具体方案如下:

类型定义

type AuthStatus =
  | { type: 'Initialising' }
  | { type: 'Authorised'; isAdmin: boolean }
  | { type: 'NoAuth' }

使用示例

只需要声明单个 AuthStatus 类型的变量即可,不需要拆分多变量:

// 初始化状态
let authStatus: AuthStatus = { type: 'Initialising' }

// 切换为普通授权用户
authStatus = { type: 'Authorised', isAdmin: false }

// 切换为管理员授权用户
authStatus = { type: 'Authorised', isAdmin: true }

// 切换为未授权状态
authStatus = { type: 'NoAuth' }

约束效果

TypeScript 会自动做状态合法性校验:

  • 当状态为 Initialising 或 NoAuth 时,不允许添加 isAdmin 字段,添加直接报类型错误
  • 当状态为 Authorised 时,必须传入 isAdmin 字段,不传直接报类型错误
  • 最终仅存在4种合法状态,完全不会产生非法组合

同时在分支判断时 TypeScript 会自动收窄类型,不用手动做类型断言:

if (authStatus.type === 'Authorised') {
  // 该分支下自动识别 authStatus 存在 isAdmin 字段,可直接读取
  console.log(authStatus.isAdmin)
}

如果你想保留之前的枚举写法,也可以兼容改造:

enum AuthStatusEnum {
  Initialising,
  Authorised,
  NoAuth
}

type AuthStatus =
  | { type: AuthStatusEnum.Initialising }
  | { type: AuthStatusEnum.Authorised; isAdmin: boolean }
  | { type: AuthStatusEnum.NoAuth }

内容的提问来源于stack exchange,提问作者Simon H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:06:01