如何知道传入变量是否属于特定的枚举类型?

时间:2016-06-24 13:15:41

标签: typescript

我有一个具有重载构造函数的类,其中input参数可以是数字,某个类类型的实例或某个枚举类型的值:

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("...");
}

现在,显然,当我执行“typeof arg”以防提供枚举值时,它会计算为“number”而不是“PersonType”,因此我的代码无法按预期工作。 使用instanceof作为枚举类型也不起作用,因为它只适用于对象类型。

那么,有人能告诉我当输入参数是特定的枚举类型时我怎么知道的?我在这里缺少什么?

2 个答案:

答案 0 :(得分:8)

  

那么,有人能告诉我当输入参数是特定的枚举类型时我怎么知道的?

这是不可能的。查看enum的编译代码:

打字稿:

enum PersonType { Type1, Type2 }

JavaScript的:

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

在运行时,枚举PersonType只是一个用作地图的JavaScript对象。它的成员是字符串和数字。您的示例的枚举包含:

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

因此,枚举中的成员Type1Type2是真实的数字:

console.log(PersonType.Type1) // 0

答案 1 :(得分:0)

可以使用字符串枚举

您可以这样声明一个枚举:

export enum PageNumber {
    CURRENT = "CURRENT",
    TOTAL_PAGES = "TOTAL_PAGES ",
    TOTAL_PAGES_IN_SECTION = "TOTAL_PAGES_IN_SECTION ",
}

然后您可以针对字符串进行检查:

if (typeof child === "string") {

Intelli-sense似乎没有标记错误

enter image description here

它似乎也知道枚举类型:

enter image description here