2016-09-30 6 views
17

In TypeScript möchte ich zwei Variablen vergleichen, die enum-Werte enthalten. Hier ist mein minimales Codebeispiel:Vergleichen von Enums in TypeScript

enum E { 
    A, 
    B 
} 

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

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

Wenn mit tsc (v 2.0.3) Kompilieren bekomme ich folgende Fehlermeldung:

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

Samt mit ==, !== und !=. Ich habe versucht, das const Keyword hinzuzufügen, aber das scheint keine Wirkung zu haben. Die TypeScript spec sagt der folgende:

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.

Which (glaube ich), erklärt den Fehler. Aber wie kann ich das umgehen?

Exkurs
ich mit atom-typescript den Atom-Editor bin mit, und ich erhalte keine Fehler/Warnungen in meinem Lektor. Aber wenn ich tsc im selben Verzeichnis laufe, erhalte ich den Fehler oben. Ich dachte, sie sollten die gleiche tsconfig.json Datei verwenden, aber das ist offenbar nicht der Fall.

Antwort

7

Es gibt eine andere Art und Weise:

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


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

Im Allgemeinen wird dies durch Steuerfluss basierend Typ verursacht: Wenn Sie in irgendeiner Weise betroffen sein nicht JavaScript-Code generiert werden sollen, können Sie Typumwandlung verwenden können Inferenz. Mit aktueller Typoskript Implementierung ist es ausgeschaltet, wenn Funktionsaufruf beteiligt ist, so können Sie auch dies tun:

let id = a => a 

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

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

Die seltsame Sache ist, gibt es immer noch keinen Fehler, wenn die id Funktion deklariert wird zurück die gleiche Art genau als agument:

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

Nun, ich denke, dass ich etwas gefunden, das funktioniert:

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

Aber ich bin ein wenig überrascht, dass dies nicht überall in der Dokumentation erwähnt.

+1

Wesen, das nicht für mich arbeiten. Ich bekomme ein undefinierbares – dave0688

1

Das einzige, was für mich gearbeitet (in Typoskript 2.2.1), war dies:

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

Dies vergleicht t Die Zeichenfolgen, die die Namen darstellen (z. B. "A und B").

0

Wenn konnte zwei Aufzählungen mit diesem mit

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

vergleichen Produkttypen dieses export enum ProductTypes{Merchandises,Goods,...}