Chciałbym powtórzyć TypeScript enum
typ i uzyskać nazwę każdego wyliczonego symbolu, np .:
enum myEnum { entry1, entry2 }
for (var entry in myEnum) {
// use entry's name here, e.g., "entry1"
}
enums
typescript
CalvinDale
źródło
źródło
getAllEnumValues
igetAllEnumKeys
dla twojego celuOdpowiedzi:
Kod, który opublikowałeś, będzie działał; wydrukuje wszystkich członków wyliczenia, w tym wartości członków wyliczenia. Na przykład następujący kod:
Wydrukuje następujące:
Jeśli zamiast tego chcesz tylko nazwy członków, a nie wartości, możesz zrobić coś takiego:
Spowoduje to wydrukowanie tylko nazw:
Zastrzeżenie: to w niewielkim stopniu opiera się na szczegółach implementacji: TypeScript kompiluje wyliczenia do obiektu JS z wartościami wyliczania będącymi elementami tego obiektu. Jeśli TS zdecyduje się zastosować je w przyszłości inaczej, powyższa technika może się złamać.
źródło
+enumMember >= 0
powinno być,isFinite(+enumMember)
ponieważ wartości ujemne lub zmiennoprzecinkowe również są odwzorowywane odwrotnie. ( Plac zabaw )Chociaż odpowiedź jest już udzielona, prawie nikt nie wskazał na dokumenty
Oto fragment
Należy pamiętać, że członkowie wyliczania ciągów w ogóle nie generują odwrotnego odwzorowania.
źródło
0
lub1
z tego wyliczenia?export enum Octave { ZERO = 0, ONE = 1 }
enum Enum {"A"}; let nameOfA = Enum[Enum.A];
? Od [email protected] działa dla mnie dobrze ...Zakładając, że trzymasz się zasad i tworzysz wyliczenia tylko z wartościami liczbowymi, możesz użyć tego kodu. To poprawnie obsługuje przypadek, w którym masz przypadkowo prawidłową liczbę
źródło
Dla mnie łatwiejszym, praktycznym i bezpośrednim sposobem zrozumienia tego, co się dzieje, jest następujące wyliczenie:
Zostaną zasadniczo przekonwertowane na to:
Z tego powodu będą spełnione następujące warunki:
W ten sposób można łatwo uzyskać nazwę wyliczenia w następujący sposób:
Daje to również dobry sposób na konwersję łańcucha na wartość wyliczoną.
Dwie powyższe sytuacje są znacznie częstszą sytuacją, ponieważ zwykle bardziej interesuje Cię nazwa konkretnej wartości i szeregowanie wartości w ogólny sposób.
źródło
Jeśli szukasz tylko nazw i iterujesz później, użyj:
źródło
Object.values(myEnum).filter(value => typeof value === 'string') as string[];
Object.values(myEnum).filter(value => typeof value === 'string').map(key => { return {id: myEnum[key], type: key }; });
W obecnej wersji 1.8.9 TypeScript używam wpisywanych wyliczeń:
z wynikami w tym obiekcie Javascript:
więc muszę wyszukiwać klucze i wartości i zwracać tylko wartości:
I otrzymuję klucze opcji w tablicy:
źródło
Począwszy od TypeScript 2.4, wyliczenia mogą zawierać inicjatory ciągów https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4.html
To pozwala napisać:
i uzyskaj ten wynik:
źródło
To rozwiązanie również działa.
źródło
Innym ciekawym rozwiązaniem znalezionym tutaj jest użycie ES6 Map:
POSŁUGIWAĆ SIĘ
źródło
Niech
ts-enum-util
( github , npm ) wykona pracę za Ciebie i zapewni wiele dodatkowych narzędzi bezpiecznych dla danego typu. Działa zarówno z ciągami znaków, jak i numerycznymi, poprawnie ignorując wpisy wyszukiwania wstecznego indeksu liczbowego dla liczbowych:Wyliczenie ciągu:
Wyliczenie numeryczne:
źródło
Począwszy od TypeScript 2.4, wyliczenie nie zawierałoby już klucza jako członka. źródło z Readme TypeScript
Moje rozwiązanie:
źródło
Możesz użyć
enum-values
pakietu, który napisałem, gdy miałem ten sam problem:Git: wartości wyliczeniowe
źródło
Na podstawie niektórych powyższych odpowiedzi wymyśliłem podpis funkcji bezpiecznej dla typu:
Stosowanie:
rodzaj
stringVals
jest'entry1' | 'entry2'
Zobacz to w akcji
źródło
(keyof T)[]
zamiastkeyof T
. Ponadtoexport
zatrzymuje działanie Twojego placu zabaw.Wygląda na to, że żadna z odpowiedzi tutaj nie będzie działać z
strict
wyliczeniami ciągów w trybie -mode.Rozważ enum jako:
Dostęp do tego za pomocą
AnimalEnum["dog"]
może spowodować błąd:Element implicitly has an 'any' type because expression of type 'any' can't be used to index type 'typeof AnimalEnum'.ts(7053)
.Odpowiednie rozwiązanie dla tego przypadku, napisz je jako:
źródło
keyof
ztypeof
! Inne rozwiązanie wydaje się dość nieprzejrzyste, ale mimo wszystko myślę, że maszynopis musi ciągle poprawiać DX - Doświadczenie programistyczne dla EnumMyślę, że najlepszym sposobem jest po prostu zadeklarowanie pożądanych wartości wyliczeniowych. W ten sposób dostęp do nich jest czysty i ładny (za każdym razem).
będzie produkować:
źródło
Zgodnie z dokumentacją TypeScript możemy to zrobić za pomocą Enum z funkcjami statycznymi.
Uzyskaj nazwę enum z funkcjami statycznymi
Aby przeczytać więcej o Enum z funkcją statyczną, skorzystaj z poniższego linku https://basarat.gitbooks.io/typescript/docs/enums.html
źródło
Jedyne rozwiązanie, które działa dla mnie we wszystkich przypadkach (nawet jeśli wartości są łańcuchami), jest następujące:
źródło
Stare pytanie, ale dlaczego nie korzystać z
const
mapy obiektów?Zamiast tego:
Zrób to (zwróć uwagę na
as const
obsadę):źródło
console.log(Object.keys(Foo))
w pierwszym przykładzie powraca tylko["BAR", "EVERYTHING_IS_TERRIBLE"]
...["60", "80", "BAR", "EVERYTHING_IS_TERRIBLE"]
Znalazłem to pytanie, wyszukując „Iteracja TypeScript po kluczach wyliczeniowych”. Chcę tylko opublikować rozwiązanie, które działa w moim przypadku. Może to też komuś pomoże.
Mój przypadek jest następujący: chcę iterować po każdym kluczu wyliczającym, następnie filtrować niektóre klucze, a następnie uzyskać dostęp do obiektu, który ma klucze jako wyliczone wartości z wyliczenia. Tak właśnie to robię bez żadnego błędu TS.
źródło
Napisałem klasę EnumUtil, która sprawdza typ według wartości wyliczeniowej:
Jak tego użyć:
Wynik dla kluczy NumberValueEnum: [„A”, „B”]
Wynik dla wartości NumberValueEnum: [0, 1]
Wynik dla StringValueEnumkeys: [„A”, „B”]
Wynik dla StringValueEnumvalues: [„A”, „B”]
źródło
Uważam to rozwiązanie za bardziej eleganckie:
To pokazuje:
źródło
Moje Enum jest takie:
więc wykonanie tego zwrotu jest niezdefiniowane :
Aby rozwiązać ten problem, wybieram inny sposób, aby to zrobić za pomocą potoku:
I aby go użyć:
źródło
Jeśli masz wyliczenie
Następnie możesz uzyskać klucz i wartości, takie jak:
źródło
Argument of type '(d: Diet) => void' is not assignable to parameter of type '(value: string, index: number, array: string[]) => void'. Types of parameters 'd' and 'value' are incompatible. Type 'string' is not assignable to type 'MyEnum'.(2345)
Napisałem funkcję pomocnika do wyliczenia wyliczenia:
Stosowanie:
Funkcja zwraca coś, co można łatwo wyliczyć, a także rzutuje na typ wyliczeniowy.
źródło
Korzystając z bieżącej wersji TypeScript, możesz użyć funkcji takich jak te, aby zamapować Enum na wybrany rekord. Zauważ, że nie możesz zdefiniować wartości ciągu za pomocą tych funkcji, ponieważ szukają kluczy o wartości, która jest liczbą.
źródło
Jest już wiele odpowiedzi, ale myślę, że i tak wrzucę swoje rozwiązanie na stos.
Plac zabaw TypeScript
Dla jasności:
Referencje dla rekordu TypeScript
Fajna funkcja pomocnika:
źródło
Aby uzyskać listę wartości wyliczeniowych, musisz użyć:
źródło
To nie jest dokładnie odpowiedź na twoje pytanie, ale jest to sztuczka, aby rozwiązać swój problem.
Możesz rozszerzyć swój model listy w dowolny sposób.
Teraz możesz go używać w następujący sposób:
lub:
źródło