2016-09-30 7 views
17

TypeScriptでは、enum値を含む2つの変数を比較したいと思います。ここに私の最小限のコードの例です:TypeScriptでEnumを比較する方法

enum E { 
    A, 
    B 
} 

let e1: E = E.A 
let e2: E = E.B 

if (e1 === e2) { 
    console.log("equal") 
} 

tsc(V 2.0.3)私は次のエラーを取得するとコンパイル:==!==!=

TS2365: Operator '===' cannot be applied to types 'E.A' and 'E.B'.

同じ。 constキーワードを追加しようとしましたが効果がないようです。 TypeScript specには、次の言葉:

4.19.3 The <, >, <=, >=, ==, !=, ===, and !== operators

These operators require one or both of the operand types to be assignable to the other. The result is always of the Boolean primitive type.

どちらが(と思う)エラーを説明します。しかし、どうすれば丸めることができますか?

サイドノート
私はatom-typescriptとAtomのエディタを使用している、と私は私のエディタ内のエラー/警告を得ることはありません。しかし、同じディレクトリにtscを実行すると、上記のエラーが表示されます。私は彼らが同じtsconfig.jsonファイルを使うことになっていたと思ったが、明らかにそうではない。

if (e1.valueOf() === e2.valueOf()) { 
    console.log("equal") 
} 

しかし、私は、これはどこにでもドキュメントに記載されていないことを少し驚いている:

答えて

7

別の方法があります:一般的に

let e1: E = E.A 
let e2: E = E.B 


if (e1 as E === e2 as E) { 
    console.log("equal") 
} 

、これは制御フローベースの種類によって引き起こされる:あなたはどのような方法で影響されるJavaScriptコードを生成したくない場合は、あなたは型キャストを使用することができます推論。

let id = a => a 

let e1: E = id(E.A) 
let e2: E = id(E.B) 

if (e1 === e2) { 
    console.log('equal'); 
} 

奇妙なことがid機能が正確に同じ型を返すように宣言されている場合、エラーがまだ存在しない、次のとおりです。関数呼び出しが関与している時はいつでも、現在のtypescriptです実装では、それはあなたもこれを行うことができますので、オフになってそのagumentとして:これはトンを比較

if (E[e1] === E[e2]) { 
    console.log("equal") 
} 

function id<T>(t: T): T { return t; } 
5

まあ、私は私が働く何かを見つけたと思います。

+1

ことで、この

if (product.ProductType && (product.ProductType.toString() == ProductTypes[ProductTypes.Merchandises])) { // yes this item is of merchandises } 

を持つ2つの列挙型を比較す​​ることができました。私は未定義になっています – dave0688

1

(typescriptです2.2.1で)私のために働いた唯一のことは、このました彼は名前を表す文字列(eg。 「A」および「B」)。

0

の場合はProductTypesが私のために動作しません。このexport enum ProductTypes{Merchandises,Goods,...}

関連する問題