2016-10-05 75 views
0

我在TypeScript中遇到了一個我無法解決的問題。枚舉中的TypeScript聯盟

下面的代碼

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,但我無法讓它工作。 有沒有可能用enums做到這一點?請注意,我將在枚舉中有許多其他條目,所以我不想混淆位運算符,因爲它很快就會變得不可讀和不可維護。

如果不可能使它與枚舉一起工作,那麼採用什麼最好的邏輯?類和子類?類型?其他?

+0

這是不可能平等,使其 - 如果攻擊等於PowerAttack和攻擊等同於MagicAttack,然後PowerAttack必須等於MagicAttack。 – artem

+0

*我試圖做測試。攻擊等於test.PowerAttack AND test.MagicAttack *如何在同一時間等同於兩件不同的事情?通過「平等」,你的意思是「匹配」在按位意義?你是指'或'('|')而不是'和'('&')(大概不合邏輯和('&&')? – 2016-10-05 03:52:05

+0

順便說一句,你說「無效」是什麼意思?編輯對我來說很好(儘管現在它可能不會做你想做的) – 2016-10-05 03:54:52

回答

1

好像你想使用枚舉值作爲標誌。最簡單的方法是使用單位二進制數字。例如

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

然後你就可以測試爲:

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

更多

這是這裏介紹:https://basarat.gitbooks.io/typescript/content/docs/enums.html#enums-as-flags

+0

謝謝!這就是我正在尋找的東西。我沒有看到if語句中的運算符差異,但有沒有一種標準的方法來設置下一個枚舉值成員? 例如,下面的代碼中的NotAnAttack返回true fo r(Action.NotAnAttack&Action.Attack),但是如果我將其賦值爲1 << 2,我就不會這麼做了。我閱讀了編譯後的JS,這很有道理,但我只想知道是否有標準/自動的預防方法這種行爲。 '枚舉動作{ PowerAttack = 1 << 0, MagicAttack = 1 << 1, NotAnAttack, 攻擊= PowerAttack | MagicAttack, }' – Canardlaquay

1

我假設你想

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

我們定義test.Attack爲按位或兩個其他值,換句話說7

現在test.PowerAttacktest.MagicAttack可以爲「會員」在test.Attack測試通過說test.PowerAttack & test.Attack。如果你想要基於比特的枚舉,你不能避免使用&來測試包含 - 這就是你必須要做的。

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

謝謝你的回答和評論,他們幫助我理解了整個按位概念,正如我對@basarat'我完全錯過了它是條件語句中'&'而不是'=='操作符的事實 即使您的示例適用於這種情況,只要我在枚舉中添加兩個其他成員,它與test.Attack的值重疊(7)。 – Canardlaquay