2017-06-06 119 views
1

我使用打字稿2.2.1目标枚举ES5字符串转换为在打字稿

我有这样几个枚举下面

enum PermissionLevel { 
    ACCOUNT_OWN, 
    ACCOUNT_OTHER, 
    USER_OWN 
} 

enum Permission { 
    ACCOUNT_CREATE, 
    USER_CREATE 
} 

我有一个输入JSON如下

{ 
    "ACCOUNT_OWN": [ 
     "USER_CREATE", 
     "ACCOUNT_CREATE" 
    ], 
    "ACCOUNT_OTHER": [ 
     "USER_CREATE" 
    ] 
} 

我想存储这个输入为Map<Permission, Array<PermissionLevel>>

以下是我的代码

 // assume authJson is the input and is a valid JSON. 
     this.userPermissions = new Map<Permission, Array<PermissionLevel>>(); 
     for (let [level, permissions] of Object.entries(authJson)) { 
      let newLevel: PermissionLevel = <any>PermissionLevel[level]; 
      for (let perm of permissions) { 
       let newPermission: Permission = <any>Permission[perm]; 
       if (this.userPermissions.get(newPermission)) { 
        this.userPermissions.set(newPermission, this.userPermissions.get(newPermission).concat(newLevel)); 
       } else { 
        this.userPermissions.set(newPermission, new Array<PermissionLevel>().concat(newLevel)); 
       } 
      } 
     } 

     console.log(JSON.stringify(this.userPermissions)); 

最后一条语句的输出为空:(。不知道我在这里做错了什么。

更新:我刚刚发现下面

EXCEPTION: Uncaught (in promise): ReferenceError: PermissionLevel is not defined 

有运行时错误行这里是一个TS小提琴 - 在JavaScript https://jsfiddle.net/hrwyc6zv/1/

+0

你能分享你生成的JS代码? – amiramw

+1

只能使用点符号访问枚举值。枚举在运行时作为对象生成。但是这个名字不是你TS代码中的名字。它被生成。 – amiramw

+0

@amiramw真的,我忘了那 – Hydro

回答

2

Map对象是不是一个JSON。因此JSON.stringify不显示其实际内容。

小试在Firefox:

var x = new Map() 
x.set('a','b') 
-> Map { a: "b" } 
JSON.stringify(x) 
-> "{}" 
+0

我更新了我的帖子,发现一个错误,我看到控制台.. – TechCrunch

+0

你说的是正确的。我在地图上用字符串来调试它是错误的。 – TechCrunch