2017-07-27 4 views
-1

Ich habe markiert Enum unterTyposkript gekennzeichnet Enum erhalten Werte

enum PermissionEnum { 
    SU = 1 << 0,   // 1 
    Administrator = 1 << 1, // 2 
    User = 1 << 2   // 4 
} 

Für gegebenen Wert 6, wie kann ich

string [] erhalten -> [ 'Administrator', 'User']

Nummer [] -> [2,4]

Antwort

0

Das sollte funktionieren:

let x: PermissionEnum = PermissionEnum.Administrator | PermissionEnum.User; 

const permNum: number[] = []; 
const permStr: string[] = []; 
let i = 0; 
let perm: number; 
while (PermissionEnum[perm = 1 << i++]) { 
    if (x & perm) { 
     permNum.push(perm); 
     permStr.push(PermissionEnum[perm]); 
    } 
} 
0

Sie können dem Namespace enum eine statische Funktion hinzufügen und diese für die Konvertierung verwenden.

Sie können auch einen Trick verwenden, um die gesetzten Bits aus einer Zahl zu extrahieren, ohne über alle unscharfen iterieren zu müssen: n & (~n+1) gibt Ihnen das niedrigste gesetzte Bit.

enum PermissionEnum { 
    SU = 1 << 0,   // 1 
    Administrator = 1 << 1, // 2 
    User = 1 << 2   // 4 
} 
namespace PermissionEnum { 
    export function toValues(n: PermissionEnum) { 
    const values: string[] = []; 
    while (n) { 
     const bit = n & (~n+1); 
     values.push(PermissionEnum[bit]); 
     n ^= bit; 
    } 
    return values; 
    } 
} 
console.log(PermissionEnum.toValues(PermissionEnum.Administrator)); 
console.log(PermissionEnum.toValues(PermissionEnum.Administrator + PermissionEnum.SU)); 

Ausgang ist:

[ 'Administrator' ] 
[ 'SU', 'Administrator' ] 

Die Umstellung auf Zahlen wäre das gleiche, aber nur bit ohne Nachschlag schieben.