【发布时间】:2017-01-16 17:07:45
【问题描述】:
我才刚接触 TypeScript 几个月,正在深入研究它的内部工作原理。也许有人可以帮助提高我的理解。
在我们的 angular2 应用程序中,我们有一个enum 的权限定义为:
export enum UserPrivileges{
SUPER,
USER,
GUEST
}
我们将此类型作为枚举类型的数组包含在函数定义中:
checkPrivileges(userPrivileges: UserPrivileges[]) {...}
我们用来查找用户权限的模式是:
this.isSuperUser = userPrivileges.includes(UserPrivileges[UserPrivileges.SUPER]);
问题
TypeScript 抱怨 “'string' 类型的参数不能分配给 'UserPrivileges' 类型”,因为 Array.prorotype.includes() 方法调用(.indexOf() 存在同样的问题。)
我想不到的就地铸造形式都不起作用:
this.isSuperUser = userPrivileges.includes(<string>UserPrivileges[UserPrivileges.SUPER]);
this.isSuperUser = userPrivileges.includes(UserPrivileges[UserPrivileges.<string>SUPER]);
我们可以“欺骗” tsc linter 并将函数签名更改为:
checkPrivileges(userPrivileges: string[]) {...}
...但是使用类型有什么意义呢?
这一定是一个常见的用例,但我一定缺少必要的装饰器?是否需要将方法添加到枚举类型定义中以允许将其解释为字符串?
编辑
为了清楚起见,我们的后端在数组中返回用于特权的字符串令牌,例如userPrivileges = ["SUPER", "GUEST", "USER"]。 UserPrivileges 枚举类型旨在模仿这一点。
有效的旧方法(期望true):
userPrivileges.indexOf(UserPrivileges[UserPrivileges.SUPER]) > -1;
因为
-
UserPrivileges.SUPER计算结果为0(因为解释了发出的 JS Paarth) -
UserPrivileges[0]然后计算为字符串"SUPER" - ...这是来自后端的
userPrivileges[]中的值。
而这些都将不受欢迎(但可以预见)返回false
userPrivileges.includes(UserPrivileges.SUPER);
userPrivileges.indexOf(UserPrivileges.SUPER) > -1;
出于与上述相同的原因:从服务器返回的userPrivileges[] 不包含值0。
“当您将枚举值返回给自身时,您将取回字符串。” 为了使提议的解决方案发挥作用,似乎我是否必须使用类型的 数字索引 UserPrivileges[0] 来获取字符串以与 REST 返回进行比较?
【问题讨论】:
标签: angular typescript ecmascript-6