Do utworzenia enum
w TypeScript można użyć następującego kodu :
enum e {
hello = 1,
world = 2
};
Do wartości można uzyskać dostęp poprzez:
e.hello;
e.world;
Jak utworzyć wartość enum
ciągu?
enum e {
hello = "hello", // error: cannot convert string to e
world = "world" // error
};
typescript
FacePalm
źródło
źródło
Odpowiedzi:
TypeScript 2.4
Teraz ma wyliczanie ciągów, więc twój kod po prostu działa:
🌹
TypeScript 1.8
Od TypeScript 1.8 można używać literałów ciągów, aby zapewnić niezawodne i bezpieczne korzystanie z nazwanych ciągów znaków (do czego częściowo używane są wyliczenia).
Więcej informacji: https://www.typescriptlang.org/docs/handbook/advanced-types.html#string-literal-types
Wsparcie dla starszych wersji
Wyliczenia w TypeScript są oparte na liczbach.
Możesz jednak użyć klasy z elementami statycznymi:
Możesz także powiedzieć:
Aktualizacja: W oparciu o wymaganie, aby móc zrobić coś takiego,
var test:E = E.hello;
spełnia następujące wymagania:źródło
toString(): string { return this.value; }
toString
zwraca ciąg, ponieważ zwracathis.value
ivalue
jest typu ciąg. Więc nie możesz tego zrobić,var x:number = E.hello.toString();
a jeśli to zrobisz,var x = E.hello.toString();
x ma również postać typustring
:)get()
metody ma jakąś wadęreturn this.value
? W ten sposób zwróci wartość ciągu przy każdym dostępie, a nie tylko podczas konwersjitoString()
.value
element członkowski na wszystkich typach i potraktuje je jako typy porównywalne. Możesz jednak ustawićvalue
członka jako prywatny. W ten sposób kompilator go nie zobaczy i nie spróbuje zastosować typowania strukturalnego.W najnowszej wersji (1.0RC) TypeScript możesz używać takich znaków:
Aktualizacja 1
Aby uzyskać wartość liczbową elementu enum z wartości ciągu, możesz użyć tego:
Aktualizacja 2
W najnowszym TypeScript 2.4 wprowadzono wyliczenia ciągów, takie jak to:
Aby uzyskać więcej informacji o TypeScript 2.4, przeczytaj blog na MSDN .
źródło
States[str]
dzisiejszych czasach nie działa.Type 'string' is not assignable to type 'States'
States[str as any]
do wykonania w bieżącej (2.x) wersji Typescript.TypeScript 2.4+
Możesz teraz przypisywać wartości ciągów bezpośrednio członom wyliczającym:
Aby uzyskać więcej informacji, patrz # 15486 .
TypeScript 1.8+
W TypeScript 1.8+ można utworzyć literał ciąg znaków, aby zdefiniować typ i obiekt o tej samej nazwie dla listy wartości. Naśladuje oczekiwane zachowanie enum strunowego.
Oto przykład:
Który będzie działał jak wyliczenie łańcucha:
Upewnij się, że wpisałeś wszystkie ciągi w obiekcie! Jeśli tego nie zrobisz, w pierwszym przykładzie powyżej zmienna nie zostałaby domyślnie wpisana
MyStringEnum
.źródło
W TypeScript 0.9.0.1, mimo że występuje błąd kompilatora, kompilator nadal może skompilować plik ts do pliku js. Kod działa zgodnie z naszymi oczekiwaniami, a Visual Studio 2012 może obsługiwać automatyczne uzupełnianie kodu.
Aktualizacja :
W składni TypeScript nie pozwala nam tworzyć wyliczenia z wartościami łańcuchowymi, ale możemy zhakować kompilator: p
Plac zabaw
źródło
case Link.LEARN:
DostanieCannot convert 'Link.LEARN' to 'string'
błąd kompilacji. Przesyłanie nie będzie działać.TypeScript 2.1 +
Typy wyszukiwania wprowadzone w TypeScript 2.1 pozwalają na inny wzorzec do symulacji ciągów znaków:
TypeScript 2.4 +
W wersji 2.4 TypeScript wprowadził natywną obsługę wyliczeń ciągów, więc powyższe rozwiązanie nie jest potrzebne. Z dokumentacji TS:
źródło
Colors["RED"]
nie będzie działać. Każdy pomysł, jak to rozwiązać (wymagany do konwersji JSON).Dlaczego nie skorzystać z natywnego sposobu uzyskiwania dostępu do ciągów wyliczenia.
źródło
enum Why { Because = "You Can't", Always = "Do Things That Way." }
;)Możesz używać wyliczeń ciągów w najnowszym TypeScript:
Źródło: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/
AKTUALIZACJA - 2016
Nieco bardziej niezawodny sposób tworzenia zestawu ciągów, których obecnie używam w React, jest następujący:
źródło
<string>e.hello
powoduje błąd.e.hello
jest nadal uważany przez kompilator za liczbę.<number>e.hello
jednak działa. Czy jest na to jakiś sposób? Mogę tylko myśleć<string><any>e.hello
.enum Test { a = <any>"b", b = <any>"c", c = <any>"a" }
Test.a === 'c'
<any>
<string>
someStringValue == someEnumValue.toString()
Oto dość czyste rozwiązanie, które umożliwia dziedziczenie za pomocą TypeScript 2.0. Nie próbowałem tego na wcześniejszej wersji.
Bonus: wartość może być dowolnego typu!
źródło
Hacky sposób na to jest:
CallStatus.ts
Utils.ts
Jak używać
źródło
To działa dla mnie:
lub
8)
Aktualizacja: wkrótce po opublikowaniu tego odkryłem inny sposób, ale zapomniałem opublikować aktualizację (jednak ktoś już wspomniał o tym powyżej):
źródło
Po prostu deklaruję interfejs i używam zmiennej tego typu, aby uzyskać dostęp do wyliczenia. Utrzymanie synchronizacji interfejsu i wyliczania jest w rzeczywistości łatwe, ponieważ TypeScript narzeka, jeśli coś zmienia się w wyliczeniu, tak jak to.
Zaletą tej metody jest to, że rzutowanie typu nie jest wymagane w celu użycia wyliczenia (interfejsu) w różnych sytuacjach, a zatem obsługiwanych jest więcej typów sytuacji, takich jak przełącznik / obudowa.
Użycie zmiennej zamiast wyliczenia daje pożądane wyniki.
Flagi były dla mnie kolejną koniecznością, dlatego stworzyłem moduł NPM, który dodaje się do tego przykładu i zawiera testy.
https://github.com/djabraham/ts-enum-tools
źródło
export default EAbFlagEnum as IAbFlagEnum;
zamiast ponownego tworzenia zmiennej. Usunąłem również<any>
obsadę w enum, działa dobrze.AKTUALIZACJA: TypeScript 3.4
Możesz po prostu użyć
as const
:TypeScript 2.1
Można to również zrobić w ten sposób. Mam nadzieję, że to komuś pomoże.
źródło
Dzięki niestandardowym transformatorom ( https://github.com/Microsoft/TypeScript/pull/13940 ), które są dostępne w maszynopisie @ next, możesz tworzyć obiekty podobne do enum z wartościami ciągów z literałów ciągów.
Proszę zajrzeć do mojego pakietu npm, ts-transformer-enumerate .
Przykładowe użycie:
źródło
TypeScript <2.4
z https://basarat.gitbooks.io/typescript/docs/types/literal-types.html
Do linku źródłowego można znaleźć więcej i łatwiejszych sposobów uzyskania literału ciągowego
źródło
Istnieje wiele odpowiedzi, ale nie widzę żadnych kompletnych rozwiązań. Problem z zaakceptowaną odpowiedzią
enum { this, one }
polega również na tym , że rozprasza ona wartość ciągu, której używasz w wielu plikach. Nie podoba mi się też „aktualizacja”, jest złożona i nie wykorzystuje też typów. Myślę, że odpowiedź Michaela Bromleya jest jak najbardziej poprawna, ale jego interfejs jest nieco kłopotliwy i może mieć związek z typem.Używam TypeScript 2.0. * Oto, co bym zrobił
let greet: Greeting = Greeting.hello
Ma również znacznie ładniejsze informacje o typie / najechaniu kursorem, gdy używa się pomocnego IDE. Wadą jest to, że musisz napisać ciągi dwa razy, ale przynajmniej w dwóch miejscach.
źródło
Odpowiedź @ basarat była świetna. Oto uproszczony, ale nieco rozszerzony przykład, którego możesz użyć:
źródło
Ostatnio napotkałem ten problem z TypeScript 1.0.1 i rozwiązałem w ten sposób:
źródło
Myślę, że powinieneś spróbować z tym, w tym przypadku wartość zmiennej nie zmieni się i działa ona podobnie jak wyliczenia, używanie jak klasy również działa, jedyną wadą jest to, że przez pomyłkę możesz zmienić wartość zmiennej statycznej i właśnie to nie chcemy w wyliczeniach.
źródło
źródło
źródło
Mały js-hacky, ale działa:
e[String(e.hello)]
źródło
Jeśli to, czego chcesz, to głównie łatwe debugowanie (z uczciwym sprawdzaniem typu) i nie musisz określać specjalnych wartości dla wyliczenia, oto co robię:
Jeśli chcesz obsługiwać przechowywanie starszego kodu / danych, możesz zachować klucze numeryczne.
W ten sposób można uniknąć dwukrotnego wpisywania wartości.
źródło
Bardzo, bardzo, bardzo proste Enum z ciągiem znaków (TypeScript 2.4)
źródło
Próbowałem w TypeScript 1.5 jak poniżej i zadziałało to dla mnie
źródło
szukałem sposobu na implementację opisów w wyliczeniach maszynopisu (v2.5) i ten wzór zadziałał dla mnie:
...
źródło
TypeScript 0.9.0.1
Plac zabaw TypeScript
źródło
Cannot convert 'string' to 'e'.
.