2016-10-05 11 views
0

TypeScriptで解決できない問題があります。TypeScriptの列挙体

はここでどのように私は2つのチェックを動作させることができ、コード

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 

ですか?

私はtest.Attackをtest.PowerAttackとtest.MagicAttackと同じにしようとしていますが、動作させることはできません。 enumでこれを行うことは可能ですか?列挙型には他にも多くのエントリがあるので、実際にはビット単位の演算子を混乱させたくないということに注意してください。

enumで動作させることができない場合は、採用するのに最適な論理は何ですか?クラスとサブクラス?タイプ?それ以外?

私はあなたが私たちは、他の言葉で7

test.PowerAttacktest.MagicAttacktest.Attackで「会員」のためにテストすることができ、ビット単位として、あるいは他の二つの値のtest.Attackを定義

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

をしたいと仮定し

+0

それは平等でそれを行うことは不可能だ - 攻撃がPowerAttackに等しい場合とアタックはMagicAttackと等しく、PowerAttackはMagicAttackと等しくなければなりません。 – artem

+0

*私はtest.Attackをtestと同じにしようとしています.PowerAttackとtest.MagicAttack *何が同時に2つの異なるものと等しくなることができますか? 「等しい」とは、ビットごとの意味で「一致」を意味しますか? –

+0

ところで、「無効」とはどういう意味ですか?あなたが指定したコードは何ですか? –

答えて

1

フラグとしてenum値を使用するようです。これを行う最も簡単な方法は、1ビットの2進数で行うことです。例えばもっと

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

これはここに覆われている:

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

は次に、あなたのようにテストすることができますhttps://basarat.gitbooks.io/typescript/content/docs/enums.html#enums-as-flags

+0

ありがとうございました!これは私が探していたものですが、if文の中で演算子の違いは見られませんでした。メンバ? たとえば、次のコードのNotAnAttackはtrueを返します。fo r(Action.NotAnAttack&Action.Attack)を指定しても、私はそれを割り当てません。<< 2。コンパイルされたJSを読んで意味がありますが、標準/自動的に防止する方法があるかどうかを知りたかっただけですこの動作。 'enumアクション{ PowerAttack = 1 << 0、 MagicAttack = 1 << 1、 NotAnAttack、 アタック= PowerAttack | MagicAttack、 } ' – Canardlaquay

1

test.PowerAttack & test.Attackと言ってください。ビットベースの列挙型が必要な場合は、&を使用してインクルードをテストすることは避けられません。

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

あなたの答えとコメントをありがとう、彼らは私がbitwiseの概念全体を理解するのを助け、私が他の@basaratのコメントに言ったように、この例ではあなたの例はうまくいくが、enumに他の2つのメンバを追加するとすぐにはうまくいくが、私は完全にそれが条件文の中の '&'で '=='それはtest.Attackの値(7)と重なっています。 – Canardlaquay