Typescript枚举值作为数组参数

时间:2017-10-25 21:02:06

标签: angular typescript

我首先要说的是,我使用的是TypeScript2.4,所以我可以使用字符串ENUM,ala

export enum PermissionScope {
BRAND = "brand",
IMAGE_MARKER = "image-marker",
COMPANY = "company",
PRODUCT = "product",
FINANCIALS = "financials"
}

我不知道如何做两件事。

  1. 我怎样才能打电话给enum,比如说

    class A {
        let a : PermissionScope;
    }
    
  2. 现在当我尝试通过

    实例化这个变量时
    A.a = PermissionScope.BRAND
    

    我收到错误

    Type 'string' is not assignable to type 'PermissionScope'.
    

    这可以通过

    来解决
    A.a = <PermissionScope> PermissionScope.BRAND
    

    但我不确定这是否是正确的解决方案,因为据我所知,潜在的问题是该变量应该是PermissionScope枚举对象类型,而不是PermissionScope的有效枚举值。

    如何设置变量类型,使其只能是枚举中的一种类型?

    第二个问题是。

    1. 如果我想询问字符串是否为有效的枚举值,又名

      ,该怎么办?
      var a = "brand"; //true
      var b = "candy crush" //false
      

1 个答案:

答案 0 :(得分:1)

对于第一个问题,你要做的不应该是一个问题 你班上的'let'可能会导致你的问题,我把它改为公开,没有问题 我还假设您的A.a示例是A的实例?你的变量'a'是一个实例变量。

class A {
    public a : PermissionScope = PermissionScope.BRAND;
}
const instance = new A();

instance.a = PermissionScope.BRAND;

回答你的第二个问题, 枚举被转换为引擎盖下的对象。在原始js中看起来像这样。

var PermissionScope;
(function (PermissionScope) {
    PermissionScope["BRAND"] = "brand";
    PermissionScope["IMAGE_MARKER"] = "image-marker";
    PermissionScope["COMPANY"] = "company";
    PermissionScope["PRODUCT"] = "product";
    PermissionScope["FINANCIALS"] = "financials";
})(PermissionScope = exports.PermissionScope || (exports.PermissionScope = {}));

因此,您可以使用“in”

查看枚举的静态部分是否有效
console.log('BRAND' in PermissionScope); //true
console.log('IMAGE_MARKER' in PermissionScope); //true
console.log('ASDF' in PermissionScope); //false

如果要检查枚举的值部分,则必须遍历对象值并检查

function isValidEnumValue(enumType: any, value: string) {
    //NOTE: Object.values is only available in ES7 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values)
    return Object.values(enumType).indexOf(value) !== -1;
}

console.log(isValidEnumValue(PermissionScope, 'brand')); //true
console.log(isValidEnumValue(PermissionScope, 'asdf')); //false