Búsqueda de sitios web

typescript - ¿Cómo saber si una variable entrante es de un tipo de enum específico?


Tengo una clase que tiene un constructor sobrecargado, donde un argumento de entrada puede ser un número, una instancia de un cierto tipo de clase o un valor de cierto tipo de enumeración:

class Person { name: string; };
enum PersonType { Type1, Type2 };

constructor(id: number);
constructor(person: Person);
constructor(personType: PersonType);
constructor(arg: string | Person | PersonType)
{
    if (typeof arg === "number") { /* do number stuff */ }
    else if (arg instanceof Person) { /* do Person stuff */ }
    else if (typeof arg === "PersonType") { /* do PersonType stuff */ }
    else throw new MyException("...");
}

Ahora, aparentemente, cuando ejecuto "typeof arg" en caso de que se proporcione un valor de enumeración, eso se evalúa como "number", y no como "PersonType", así que mi código no puede funcionar como se espera. Usar instanceof para un tipo de enumeración tampoco funciona, ya que está destinado solo para tipos de objeto.

Entonces, ¿alguien puede decirme cómo puedo saber cuándo mi argumento de entrada es de un tipo de enumeración específico? ¿Qué me falta aquí?

Respuesta #1

Entonces, ¿alguien puede decirme cómo puedo saber cuándo mi argumento de entrada es de un tipo de enumeración específico?

No es posible. Mira el código compilado del enum:

TypeScript:

enum PersonType { Type1, Type2 }

JavaScript:

var PersonType;
(function (PersonType) {
    PersonType[PersonType["Type1"] = 0] = "Type1";
    PersonType[PersonType["Type2"] = 1] = "Type2";
})(PersonType || (PersonType = {}));

En tiempo de ejecución, el enum PersonType es solo un objeto de JavaScript usado como un mapa. Sus miembros son cadenas y números. La enumeración de tu ejemplo contiene:

{
  "Type1": 0,
  "Type2": 1,
  "0": "Type1",
  "1": "Type2"
}

Entonces, los miembros Type1 y Type2 en la enumeración, son números verdaderos:

console.log(PersonType.Type1) // 0

Artículos relacionados