Как получить имена записей enums TypeScript?

Я хотел бы знать, как итерировать перечисление TypeScript и каждое перечисляемое имя символа.

Например,

enum myEnum { entry1, entry2 } for (var entry in myEnum) { // use entry's name here, eg, "entry1" } 

Код, который вы опубликовали, будет работать; он распечатает все члены enums, включая значения членов enums. Например, следующий код:

 enum myEnum { bar, foo } for (var enumMember in myEnum) { console.log("enum member: ", enumMember); } 

Распечатайте следующее:

 Enum member: 0 Enum member: 1 Enum member: bar Enum member: foo 

Если вы предпочитаете только имена членов, а не значения, вы можете сделать что-то вроде этого:

 for (var enumMember in myEnum) { var isValueProperty = parseInt(enumMember, 10) >= 0 if (isValueProperty) { console.log("enum member: ", myEnum[enumMember]); } } 

Это напечатает только имена:

Участник форума: bar

Enum член: foo

Предостережение: это немного зависит от детали реализации: TypeScript компилирует enums в объект JS с значениями enums, являющимися членами объекта. Если бы TS решила реализовать их в будущем, вышеупомянутый метод мог бы сломаться.

Хотя ответ уже предоставлен, почти никто не указал на документы

Вот fragment

 enum Enum { A } let nameOfA = Enum[Enum.A]; // "A" 

Предполагая, что вы придерживаетесь правил и только производите enums с числовыми значениями, вы можете использовать этот код. Это правильно обрабатывает случай, когда у вас есть имя, совпадающее с действительным числом

 enum Color { Red, Green, Blue, "10" // wat } var names: string[] = []; for(var n in Color) { if(typeof Color[n] === 'number') names.push(n); } console.log(names); // ['Red', 'Green', 'Blue', '10'] 

Для меня более простой, практичный и прямой способ понять, что происходит, заключается в следующем перечислении:

 enum colors { red, green, blue }; 

Будет преобразовано по существу в это:

 var colors = { red: 0, green: 1, blue: 2, [0]: "red", [1]: "green", [2]: "blue" } 

Из-за этого будет справедливо следующее:

 colors.red === 0 colors[colors.red] === "red" colors["red"] === 0 

Это создает простой способ получить имя enums следующим образом:

 var color: colors = colors.red; console.log("The color selected is " + colors[color]); 

Он также создает хороший способ преобразования строки в перечислимое значение.

 var colorName: string = "green"; var color: colors = colors.red; if (colorName in colors) color = colors[colorName]; 

Две ситуации выше – гораздо более распространенная ситуация, потому что обычно вы гораздо более заинтересованы в имени определенного значения и сериализации значений в общем виде.

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

 Object.keys(myEnum).map(key => myEnum[key]).filter(value => typeof value === 'string') as string[]; 

С помощью текущего TypeScript версии 1.8.9 я использую типизированные Enums:

 export enum Option { OPTION1 = 'this is option 1', OPTION2 = 'this is option 2' } 

с результатами в этом объекте Javascript:

 Option = { "OPTION1": "this is option 1", "OPTION2": "this is option 2", "this is option 1": "OPTION1", "this is option 2": "OPTION2" } 

поэтому я должен запрашивать ключи и значения и возвращать только значения:

 let optionNames: Array = []; for (let enumValue in Option) { let optionNameLength = optionNames.length; if (optionNameLength === 0) { this.optionNames.push([enumValue, Option[enumValue]]); } else { if (this.optionNames[optionNameLength - 1][1] !== enumValue) { this.optionNames.push([enumValue, Option[enumValue]]); } } } 

И я получаю ключи опций в массиве:

 optionNames = [ "OPTION1", "OPTION2" ]; 

Вы можете использовать пакет enum-values который я написал, когда у меня была та же проблема:

Git: значения enum

 var names = EnumValues.getNames(myEnum); 

Это решение тоже работает.

 enum ScreenType { Edit = 1, New = 2, View = 4 } var type: ScreenType = ScreenType.Edit; console.log(ScreenType[type]); //Edit 

Пусть ts-enum-util ( github , npm ) выполнит вашу работу и предоставит много дополнительных утилит типа. Работает как с строковыми, так и с числовыми enumsми, правильно игнорируя записи обратного поиска числового индекса для числовых перечислений:

Перечисление строк:

 import {$enum} from "ts-enum-util"; enum Option { OPTION1 = 'this is option 1', OPTION2 = 'this is option 2' } // type: ("OPTION1" | "OPTION2")[] // value: ["OPTION1", "OPTION2"] const keys= $enum(Option).getKeys(); // type: Option[] // value: ["this is option 1", "this is option 2"] const values = $enum(Option).getValues(); 

Числовое перечисление:

 enum Option { OPTION1, OPTION2 } // type: ("OPTION1" | "OPTION2")[] // value: ["OPTION1", "OPTION2"] const keys= $enum(Option).getKeys(); // type: Option[] // value: [0, 1] const values = $enum(Option).getValues(); 

Начиная с машинописного текста 2.4, перечисление больше не будет содержать ключ в качестве участника. источник из Typcript readme

Предостережение состоит в том, что строковые инициализированные enums не могут быть обратны, чтобы получить исходное имя члена enums. Другими словами, вы не можете писать Colors [“RED”], чтобы получить строку «Red».

Мое решение:

 export const getColourKey = (value: string ) => { let colourKey = ''; for (const key in ColourEnum) { if (value === ColourEnum[key]) { colourKey = key; break; } } return colourKey; }; 

Основываясь на некоторых ответах выше, я придумал эту сигнатуру типа безопасной:

 export function getStringValuesFromEnum(myEnum: T): keyof T { return Object.keys(myEnum).filter(k => typeof (myEnum as any)[k] === 'number') as any; } 

Применение:

 enum myEnum { entry1, entry2 }; const stringVals = getStringValuesFromEnum(myEnum); 

тип stringVals'entry1' | 'entry2' 'entry1' | 'entry2'

Смотрите это в действии

Я нахожу это решение более элегантным:

 for (let val in myEnum ) { if ( isNaN( parseInt( val )) ) console.log( val ); } 

Он отображает:

 bar foo 

Начиная с Typcript 2.4, enums могут содержать строковые intializers https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4.html

Это позволяет вам написать:

  enum Order { ONE = "First", TWO = "Second" } console.log(`One is ${Order.ONE.toString()}`); 

и получить этот результат:

Первый – первый

Единственное решение, которое работает для меня во всех случаях (даже если значения являются строками), следующее:

 var enumToString = function(enumType, enumValue) { for (var enumMember in enumType) { if (enumType[enumMember]==enumValue) return enumMember } } 
  • Сбивание «дубликата идентификатора»
  • Перегрузка конструктора в TypeScript
  • Typcript: не может получить доступ к значению элемента в унаследованном конструкторе classа
  • TypeScript Преобразование строки в число
  • Как сделать объект JSON classом типов
  • Как динамически назначать свойства объекту в TypeScript?
  • Как импортировать другие файлы TypeScript?
  • Как запустить файлы TypeScript из командной строки?
  • Значение свойства по умолчанию в компоненте React с использованием TypeScript
  • Внедрение интерфейса TypeScript с сигнатурой голосовой функции и другими полями
  • Что такое знак вопроса в имени параметра Typcript
  • Давайте будем гением компьютера.