如何使用打字稿通过名称将枚举作为变量引用

时间:2019-03-19 23:03:01

标签: javascript angular typescript enums

例如,我想从枚举定义中提取对象数组。

atom['Na']

现在,如何使用下面将'HelloWorld'作为变量传递的函数呢?

Object.keys(HelloWorldEnum).map(el => {
  return {
    label: HelloWorldEnum[el],
    value: el
  };
});


enum HelloWorldEnum {
  option1 = 'Option1',
  option2 = 'Option2',
  option3 = 'Option3'
}

即使我更改为getOptions(str) { return Object.keys([str + 'Enum']).map(el => { return { label: [str + 'Enum'][el], value: el }; }); } window[str + 'Enum'],由于窗口命名空间

假设上面的代码在 Angular组件

1 个答案:

答案 0 :(得分:0)

Typescript最终会将您的枚举定义转换为如下形式:

var HelloWorldEnum = {};
HelloWorldEnum["option1"] = "Option1";
HelloWorldEnum["option2"] = "Option2";
HelloWorldEnum["option3"] = "Option3";

如您所见。它只是本地范围内的变量名。不会将其添加到全局窗口对象或任何其他对象中。

只有一种方法可以通过javascript中的变量名来访问变量,因此不建议使用 ...这是通过使用eval()来进行的,它被认为是危险的api,可能会导致性能下降仅仅通过使用它就可以在您的JavaScript引擎中出现问题。

除了警告。这是您可能会做的事情。

var HelloWorldEnum = {};
HelloWorldEnum["option1"] = "Option1";
HelloWorldEnum["option2"] = "Option2";
HelloWorldEnum["option3"] = "Option3";

function getVariableFromScope(variable) { return eval(variable); }
function getOptions(name) {
  const _enum = getVariableFromScope(`${name}Enum`);
  return Object.keys(_enum).map(el => ({ label: _enum[el], value: el }));
};
console.log(getOptions('HelloWorld'));

最终,我认为您应该探索解决根本问题的其他方法。