как ссылаться на перечисление через его имя как переменную, используя машинопись - PullRequest
1 голос
/ 20 марта 2019

Например, я хочу извлечь массив объектов из определения Enum.

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


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

Теперь, как я могу сделать с функцией, которая передает 'HelloWorld' в качестве переменной, ниже не работает:

getOptions(str) {
    return Object.keys([str + 'Enum']).map(el => {
      return {
        label: [str + 'Enum'][el],
        value: el
      };
    });
  }

Даже я изменил на window[str + 'Enum'] или this[str + 'Enum'], что он не будет работать, поскольку определение Enum не существует ни в окне , ни в этом пространстве имен

Предположим, что приведенный выше код относится к любому из угловых компонентов

1 Ответ

0 голосов
/ 20 марта 2019

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'));

В конечном счете, я думаю, вам следует изучить другие способы решения основной проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...