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
相关产品推荐
相关产品推荐

