enum Direction {
Up = 1,
Down,
Left,
Right
}
if (typeof Direction === 'enum') {
// doesn't work
}
检查以上内容是否实际上是enum
?
答案 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;
}