Как преобразовать строку в перечисление в TypeScript?

Я определил следующий enum в TypeScript?

enum Color{ Red, Green } 

Теперь в моей функции я получаю цвет как строку. Я пробовал следующий код.

 var green= "Green"; var color : Color = green; // Error: can't convert string to enum 

Как я могу преобразовать это значение в перечисление?

Перечисления в TypeScript 0.9 основаны на строках и цифрах. Вам не нужно вводить утверждение типа для простых преобразований:

 enum Color{ Red, Green } // To String var green: string = Color[Color.Green]; // To Enum / number var color : Color = Color[green]; 

Попробовать онлайн

У меня есть документация об этом и других шаблонах Enum в моей книге OSS: https://basarat.gitbooks.io/typescript/content/docs/enums.html

Начиная с TypScript 2.1 строковые ключи в enumsх строго типизированы. keyof typeof используется для получения информации о доступных строковых клавишах ( 1 ):

 enum Color{ Red, Green } let typedColor: Color = Color.Green; let typedColorString: keyof typeof Color = "Green"; // Error "Black is not assignable ..." (indexing using Color["Black"] will return undefined runtime) typedColorString = "Black"; // Error "Type 'string' is not assignable ..." (indexing works runtime) let letColorString = "Red"; typedColorString = letColorString; // Works fine typedColorString = "Red"; // Works fine const constColorString = "Red"; typedColorString = constColorString // Works fine (thanks @SergeyT) let letColorString = "Red"; typedColorString = letColorString as keyof typeof Color; typedColor = Color[typedColorString]; 

https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types

Это примечание относится к ответу басарата, а не оригинальному вопросу.

У меня была странная проблема в моем собственном проекте, где компилятор сообщал ошибку, примерно эквивалентную «невозможно преобразовать строку в цвет», используя эквивалент этого кода:

 var colorId = myOtherObject.colorId; // value "Green"; var color: Color = Color[colorId]; // TSC error here: Cannot convert string to Color. 

Я обнаружил, что вывод colorId и он думал, что colorId является значением enums, а не идентификатором. Чтобы устранить проблему, мне пришлось указать идентификатор в виде строки:

 var colorId = myOtherObject.colorId; // Force string value here var color: Color = Color[colorId]; // Fixes lookup here. 

Я не уверен, что вызвало проблему, но я оставлю это примечание здесь, если кто-то столкнется с той же проблемой, что и я.

Получил его, используя следующий код.

 var green= "Green"; var color : Color= Color[green]; 

Если вы уверены, что строка ввода имеет точное совпадение с цветом enum, используйте:

 const color: Color = (Color)["Red"]; 

В случае, когда входная строка может не соответствовать использованию Enum:

 const mayBeColor: Color | undefined = (Color)["WrongInput"]; if(mayBeColor !== undefined){ //TSC will understand that mayBeColor of type Color here } 

Детская площадка


Если мы не будем использовать enum для типа тогда tsc покажет ошибку

Элемент неявно имеет тип «any», потому что выражение индекса не относится к типу «число».

Это означает, что по умолчанию TS Enum type работает с числовыми индексами, то есть let c = Color[0] , но не со строковыми индексами, такими как let c = Color["string"] . Это известное ограничение команды Microsoft для более общих индексов строки Object .

Я также столкнулся с той же ошибкой компилятора. Просто небольшая вариация подхода Sly_ Cardinal.

 var color: Color = Color[colorId]; 

Если машинописный компилятор знает, что тип переменной является строкой, чем это работает

 let colorName : string = "Green"; let color : Color = Color[colorName]; 

в противном случае вы должны явно преобразовать его в строку (чтобы избежать предупреждения компилятора)

 let colorName : any = "Green"; let color : Color = Color["" + colorName]; 

Во время работы оба решения будут работать.

  • Создайте перечисление со строковыми значениями в TypeScript
  • Как передать необязательные параметры в TypeScript, опустив некоторые другие необязательные параметры?
  • Typcript - расширение classа ошибок
  • Сбивание «дубликата идентификатора»
  • Почему я получаю сообщение об ошибке? Объектный литерал может указывать только известные свойства?
  • Как вы явно устанавливаете новое свойство в `window` в TypeScript?
  • Что такое знак вопроса в имени параметра Typcript
  • получить и установить в TypeScript
  • Когда я обновляю свой сайт, я получаю 404. Это с Angular2 и firebase
  • nodejs требуется внутри файла TypeScript
  • Как предотвратить ошибку? Подпись индекса типа объекта неявно имеет тип «any» при компиляции машинописных файлов с флагом noImplicitAny?
  • Interesting Posts

    Где я могу найти API-интерфейс для Firebase Cloud Messaging?

    Отображение N-мерного значения в точку на кривой Гильберта

    Что эквивалентно getLastInsertId () в CakePHP?

    Использование запятой в качестве разделителя списков с помощью AngularJS

    Перспективы: планирование повторяющихся вне офиса?

    Наследование и композиция

    Как я могу остановить удаленный компьютер от изменения раскладки клавиатуры?

    Как я могу принудительно обновить (ctrl + F5)?

    Как добавить «предоставленные» зависимости обратно в путь classа run / test tasks?

    Нет определенного типа параметра функции по умолчанию для int? Я сошел с ума?

    Как запустить тестовые методы в определенном порядке в JUnit4?

    Динамические строки MVC 5 с BeginCollectionItem

    Ошибка компиляции Xcode 7: «Ошибка команды из-за сигнала: Ошибка сегментации: 11″

    Необходимо, чтобы Woocommerce разрешала только 1 продукт в корзине. Если продукт уже находится в корзине, а еще один добавлен, он должен удалить предыдущие 1

    отправка списка / карты в качестве параметра POST

    Давайте будем гением компьютера.