【问题标题】:How to know if incoming variable is of a specific enum type?如何知道传入变量是否属于特定枚举类型?
【发布时间】:2022-02-21 18:33:15
【问题描述】:

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

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 也不起作用,因为它仅适用于对象类型。

那么,谁能告诉我如何知道我的输入参数何时属于特定枚举类型?我在这里错过了什么?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    那么,谁能告诉我如何知道我的输入参数何时属于特定枚举类型?

    这是不可能的。查看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
    

    【讨论】:

    • 好的,谢谢,这就解释了。那我就得忍受了
    【解决方案2】:

    这是一种你可以使用的变通方法:

    枚举 PersonType { Type1 = 'Type1', Type2 = 'Type2' }

    要测试传入的 arg 字符串是否为 PersonType 类型,您可以使用此检查:

    if (Object.values(PersonType).includes(arg)) {...}

    如果 arg == 'Type1' 或 'Type2' 则此检查返回 true,并且还可以支持任何新添加到枚举的条目,因为我们正在循环枚举的所有可能值

    【讨论】:

      【解决方案3】:

      字符串枚举是可能的

      你可以像这样声明一个枚举:

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

      然后你可以对照字符串检查它:

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

      Intelli-sense 似乎不会标记错误

      它似乎也知道枚举类型:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-08
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        • 2020-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多