有没有办法检查对象是否是TypeScript中的一种枚举?

时间:2017-02-02 15:56:20

标签: typescript

enum Direction {
    Up = 1,
    Down,
    Left,
    Right
}

if (typeof Direction === 'enum') {
    // doesn't work
}

检查以上内容是否实际上是enum

2 个答案:

答案 0 :(得分:2)

枚举被编译成具有双向映射的简单对象:

name => value
value => name

所以你的例子中的枚举编译为:

var Direction;
(function (Direction) {
    Direction[Direction["Up"] = 1] = "Up";
    Direction[Direction["Down"] = 2] = "Down";
    Direction[Direction["Left"] = 3] = "Left";
    Direction[Direction["Right"] = 4] = "Right";
})(Direction || (Direction = {}));

typeof的{​​{1}}是Direction。{。} 在运行时无法知道对象是枚举,而不是向所述对象添加更多字段。

修改

有时您不需要尝试使用您拥有的特定方法来解决问题,您可以改变方法。
在这种情况下,您可以使用自己的对象:

"object"

或者:

interface Direction {
    Up: 1,
    Down: 2,
    Left: 3,
    Right: 4
}
const Direction = {
    Up: 1,
    Down: 2,
    Left: 3,
    Right: 4
} as Direction;

然后将此对象转换为数组应该很简单。

答案 1 :(得分:1)

对于记录,这是一个确定对象是否为枚举的方法:

  isEnum(instance: Object): boolean {
    let keys = Object.keys(instance);
    let values = [];

    for (let key of keys) {
      let value = instance[key];

      if (typeof value === 'number') {
        value = value.toString();
      }

      values.push(value);
    }

    for (let key of keys) {
      if (values.indexOf(key) < 0) {
        return false;
      }
    }

    return true;
  }