如何根据UserRoles枚举值设置allowedPermissions属性的必填/可选性?
解决方案
要实现这种依赖角色的属性必填规则,你可以用TypeScript的联合类型拆分不同角色对应的属性约束,具体实现如下:
首先定义基础枚举类型(如果还没定义):
// 用户角色枚举 enum UserRoles { SUPERADMIN = 'SUPERADMIN', ADMIN = 'ADMIN', AGENT = 'AGENT' } // 权限枚举(示例,可根据实际需求调整) enum UserPermissions { VIEW = 'VIEW', EDIT = 'EDIT', DELETE = 'DELETE' }
接下来定义IRequireUserPermits联合类型,拆分两种场景:
type IRequireUserPermits = // 角色为SUPERADMIN/ADMIN时,allowedPermissions可选 | { minimalRequiredRole: UserRoles.SUPERADMIN | UserRoles.ADMIN; allowedPermissions?: UserPermissions[]; } // 角色为AGENT时,allowedPermissions必须填写 | { minimalRequiredRole: UserRoles.AGENT; allowedPermissions: UserPermissions[]; };
补充:含共同属性的优化写法
如果接口还有所有角色通用的属性,可以把公共部分抽出来,用交叉类型合并,让代码更简洁:
// 公共属性示例 type BasePermitProps = { componentId: string; desc?: string; }; type IRequireUserPermits = | (BasePermitProps & { minimalRequiredRole: UserRoles.SUPERADMIN | UserRoles.ADMIN; allowedPermissions?: UserPermissions[]; }) | (BasePermitProps & { minimalRequiredRole: UserRoles.AGENT; allowedPermissions: UserPermissions[]; });
这样定义后,TypeScript会自动做校验:
- 当
minimalRequiredRole设为UserRoles.AGENT时,编辑器会强制要求传入allowedPermissions; - 角色为另外两个值时,
allowedPermissions可省略,也可按需传入。
内容的提问来源于stack exchange,提问作者mmozedev
相关产品推荐
相关产品推荐

