hur jämförs typescript enum-värde?


enum A {
   a = 1,
   b = 2
}

namespace N1 {
   export enum A {
       a = 1,
       b = 2
   }
}
// it will pass type check
console.log(A.a === N1.A.a)

när jag tar bort nyckelordet const, kommer uttrycket att klara typkontrollen.

Men om const lades till, säger tsc

Detta villkor kommer alltid att returnera 'false' eftersom typerna 'A' och 'N1.A' inte har någon överlappning.

Jag vill veta hur enum i TS jämför enumvärden under huven.

Svar #1

Enligt link

Const-enumerationer kan endast använda konstanta enum-uttryck och till skillnad från vanliga enumerationer tas de helt bort under kompilering. Medlemmar i en const-enumeration integreras direkt på användningsplatsen. Detta är möjligt eftersom const-enumerationer inte kan ha beräknade medlemsvärden.

För att illustrera, överväg koden nedan - :

enum A {
   a = 1,
   b = 2
}

namespace N1 {
   export const enum A {
       a = 1,
       b = 2
   }
}

console.log(N1.A.a);
console.log(A.a);

som kommer att transpileras till - :

"use strict";
var A;
(function (A) {
    A[A["a"] = 1] = "a";
    A[A["b"] = 2] = "b";
})(A || (A = {}));
console.log(1);
console.log(A.a);

Som du kan se - :

  1. Det finns ingen referens till const enum A i den transpilerade koden.
  2. Konsolutmatningen av att skriva ut N1.A.a konverterad till literal typ 1.

Så vid kompileringstid kan literal type 1 och A.a inte jämföras och du måste typomvandla const enum till nummer som nedan -

console.log(N1.A.a as number === A.a) 

Du kan vidare kontrollera den bokstavliga typjämförelsen i tråden nedan -

Operatorn '==' kan inte tillämpas på typerna x och y i Typescript 2