Как сравнить Enums в TypeScript

В 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: Оператор '===' не может применяться к типам "E.A" и "E.B".

То же самое с ==, !== и !=. Я попытался добавить ключевое слово const, но это, кажется, не имеет никакого эффекта. TypeScript spec говорит следующее:

4.19.3 Операторы <, > , < =, > =, ==,! =, === и и == ==

Эти операторы требуют, чтобы один или оба типа операндов были назначены другому. Результат всегда имеет булевский примитивный тип.

Какой (я думаю) объясняет ошибку. Но как я могу обойти это?

Боковое примечание
Я использую редактор Atom с atom-typescript, и я не получаю никаких ошибок/предупреждений в моем редакторе. Но когда я запускаю tsc в том же каталоге, я получаю ошибку выше. Я думал, что они должны использовать один и тот же файл tsconfig.json, но, по-видимому, это не так.

Ответ 1

Есть и другой способ: если вы не хотите, чтобы сгенерированный код javascript каким-либо образом затрагивался, вы можете использовать тип cast:

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


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

В общем, это вызвано выводом типа на основе потока управления. При текущей реализации typescript она отключается всякий раз, когда задействован вызов функции, поэтому вы также можете сделать это:

let id = a => a

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

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

Странно, что до сих пор нет ошибки, если объявлена ​​функция id для возврата точно того же типа, что и ее агитация:

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

Ответ 2

Ну, я думаю, что нашел что-то, что работает:

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

Но я немного удивлен, что это нигде не упоминается в документации.

Ответ 3

Единственное, что сработало для меня (в typescript 2.2.1), было следующее:

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

Это сравнивает строки, представляющие имена (например, "A" и "B" ).

Ответ 4

Если бы удалось сравнить два перечисления с этим

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

с ProductTypes это export enum ProductTypes{Merchandises,Goods,...}