2016-10-05 5 views
0

Ich habe ein Problem in TypeScript, die ich nicht zu lösen scheinen.TypeScript Union in enums

Hier ist der Code

enum test{ 
    PowerAttack = 2, 
    MagicAttack = 5, 
    Attack = PowerAttack && MagicAttack //invalid 
} 

document.body.innerHTML = (test.PowerAttack == test.Attack).toString(); //check1 
document.body.innerHTML += (test.MagicAttack == test.Attack).toString();//check2 

Wie kann ich die beiden Kontrollen funktioniert?

Ich versuche, test.Attack gleich zu test.PowerAttack UND test.MagicAttack, aber ich kann es nicht funktionieren. Ist das mit enums möglich? Bitte beachten Sie, dass ich viele andere Einträge in der Enumeration haben werde, so dass ich mich nicht wirklich mit bitweisen Operatoren anlegen will, da diese ziemlich schnell unleserlich und nicht erreichbar werden.

Wenn es nicht möglich ist, es mit Enums arbeiten zu lassen, was ist die beste Logik zu übernehmen? Klassen und Unterklassen? Typen? Sonst?

+0

Es ist nicht möglich, es mit Gleichheit zu machen - wenn Angriff gleich PowerAttack und Angriff ist gleich MagicAttack, dann muss PowerAttack MagicAttack gleich sein. – artem

+0

* Ich versuche, test.Attack gleich zu test.PowerAttack UND test.MagicAttack * Wie kann etwas gleich zwei verschiedene Dinge gleichzeitig sein? Mit "gleich" meinen Sie "Übereinstimmungen" in einem bitweisen Sinne? Meinst du 'oder' ('|') statt 'und' ('&') (vermutlich nicht logisch und ('&&')? –

+0

Übrigens, was meinst du mit "ungültig"? Der Code, den du gibst Kompiliert gut für mich (obwohl es so ist, wie es aussieht, tut es wahrscheinlich nicht das, was du willst) –

Antwort

1

Scheint, dass Sie Enum-Werte als Flags verwenden möchten. Der einfachste Weg, dies zu tun, ist, mit Einzelbit-Binärzahlen zu gehen. z.B.

enum Test { 
    PowerAttack = 1 << 0, 
    MagicAttack = 1 << 1, 
    Attack = PowerAttack | MagicAttack 
} 

Dann können Sie testen, wie:

var test: Test // you get this from somewhere 
if (test & Test.Attack) { 
    console.log('has attack'); 
} 

Mehr

Das hier abgedeckt: https://basarat.gitbooks.io/typescript/content/docs/enums.html#enums-as-flags

+0

Danke! Das ist, was ich gesucht. Ich habe nicht die Operator-Unterschied innerhalb der if-Anweisung.Obwohl, gibt es eine Standard-Möglichkeit, einen Wert auf die nächste enum Mitglieder? Zum Beispiel gibt NotAnattack im folgenden Code True zurück r (Action.NotAnAttack & Action.Attack), aber nicht, wenn ich es 1 << 2 zuweisen. Ich lese das kompilierte JS und es macht Sinn, aber ich wollte nur wissen, ob es eine Standard/automatische Art der Verhinderung gab Dieses Verhalten. 'Enum Aktion { PowerAttack = 1 << 0, MagicAttack = 1 << 1, NotAnAttack, Angriff = PowerAttack | MagicAttack, } ' – Canardlaquay

1

Ich nehme an, Sie wollen

enum test{ 
    PowerAttack = 2, 
    MagicAttack = 5, 
    Attack = PowerAttack | MagicAttack 
} 

Wir definieren test.Attack als bitweise oder der beiden anderen Werte, mit anderen Worten 7.

Jetzt test.PowerAttack und test.MagicAttack für „Mitgliedschaft“ in test.Attack getestet werden indem Sie test.PowerAttack & test.Attack sagen. Wenn Sie Bit-basierte Enums verwenden möchten, können Sie nicht & verwenden, um die Inklusion zu testen - so müssen Sie es tun.

document.body.innerHTML = (test.PowerAttack & test.Attack).toString(); //check1 
document.body.innerHTML += (test.MagicAttack & test.Attack).toString();//check2 
+0

Vielen Dank für deine Antworten und Kommentare, sie haben mir geholfen, das ganze bitweise Konzept zu verstehen, und wie ich schon sagte auf meinem anderen Kommentar zu @basarat ' Ich habe die Tatsache, dass es ein "&" und kein '== Operator in der Bedingung war, komplett vermisst. Auch wenn Ihr Beispiel gut für diesen Fall funktioniert, sobald ich zwei andere Mitglieder in der Enum hinzufügen , es überlappt mit test.Attack Wert (7). – Canardlaquay