2016-09-30 23 views
17

W TypeScript, chcę porównać dwie zmienne zawierające wartości wyliczeniowe. Oto mój minimalny przykład kodu:Jak porównać wyliczenia w TypeScript

enum E { 
    A, 
    B 
} 

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

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

Podczas kompilacji z tsc (v 2.0.3) pojawia się następujący błąd:

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

samo z ==, !== i !=. Próbowałem dodać słowo kluczowe const, ale wydaje się, że nie ma ono żadnego efektu. TypeScript spec mówi co następuje:

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.

Które (chyba) wyjaśnia ten błąd. Ale jak mogę to obejść?

uwaga Side
Używam edytora Atom z atom-typescript, a ja nie dostać jakieś błędy/ostrzeżenia w moim edytorze. Ale kiedy uruchomię tsc w tym samym katalogu, otrzymam powyższy błąd. Myślałem, że powinni używać tego samego pliku tsconfig.json, ale najwyraźniej tak nie jest.

Odpowiedz

7

Jest też inny sposób: jeśli nie chcesz wygenerowany kod JavaScript, żeby być w żaden sposób, można użyć typu cast:

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


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

w ogóle, jest to spowodowane typu w oparciu kontrola przepływu wnioskowanie. Przy obecnej implementacji maszynopis, jest on wyłączony, gdy wywołanie funkcji jest zaangażowany, więc można też to zrobić:

let id = a => a 

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

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

Dziwne jest to, nadal nie ma błędu, jeśli funkcja id deklaruje powrót dokładnie tego samego typu jako agument:

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

Dobrze Myślę, że znalazłem coś, co działa:

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

Ale jestem trochę zaskoczony, że to nie jest nigdzie wspomniane w dokumentacji.

+1

to nie działa dla mnie. Mam niezdefiniowane – dave0688

1

Jedyną rzeczą, która pracowała dla mnie (w maszynopisie 2.2.1) był następujący:

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

porównania t on ciągi reprezentujące nazwy (np. "A" i "B").

0

Jeśli był w stanie porównać dwa teksty stałe z tym

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

z ProductTypes jest to export enum ProductTypes{Merchandises,Goods,...}