W tym pytaniu jest wiele mieszanych informacji, dlatego omówmy całą implementację dla TypeScript 2.x + w Przewodniku Nicka dotyczącym korzystania z wyliczeń w modelach z TypeScript .
Ten przewodnik jest przeznaczony dla: osób tworzących kod po stronie klienta, który pobiera zestaw znanych ciągów z serwera, który byłby wygodnie modelowany jako Enum po stronie klienta.
Zdefiniuj wyliczenie
Zacznijmy od wyliczenia. Powinno to wyglądać mniej więcej tak:
export enum IssueType {
REPS = 'REPS',
FETCH = 'FETCH',
ACTION = 'ACTION',
UNKNOWN = 'UNKNOWN',
}
Warto zwrócić uwagę na dwie rzeczy:
Wyraźnie deklarujemy je jako przypadki wyliczenia oparte na łańcuchach znaków, co pozwala nam tworzyć ich wystąpienia za pomocą łańcuchów, a nie innych niepowiązanych liczb.
Dodaliśmy opcję, która może lub nie może istnieć na nasz model serwera: UNKNOWN
. Można sobie z tym poradzić tak undefined
, jak wolisz, ale | undefined
w miarę możliwości lubię unikać typów, aby uprościć obsługę.
Wspaniałą rzeczą w posiadaniu UNKNOWN
sprawy jest to, że możesz być naprawdę oczywisty w kodzie i tworzyć style dla nieznanych przypadków wyliczeniowych jasnoczerwonych i mrugających, abyś wiedział, że nie radzisz sobie z czymś poprawnie.
Analizuj wyliczenie
Być może używasz tego wyliczenia osadzonego w innym modelu lub zupełnie osobno, ale będziesz musiał przeanalizować wyliczenie napisane ciągiem Y z JSON lub XML (ha) w silnie napisanym odpowiedniku. Parser ten osadzony w innym modelu żyje w konstruktorze klas.
parseIssueType(typeString: string): IssueType {
const type = IssueType[typeString];
if (type === undefined) {
return IssueType.UNKNOWN;
}
return type;
}
Jeśli wyliczenie zostanie poprawnie przeanalizowane, zakończy się poprawnym typem. W przeciwnym razie będzie undefined
i możesz go przechwycić i zwrócić swoją UNKNOWN
sprawę. Jeśli wolisz używać undefined
jako swojego nieznanego przypadku, możesz po prostu zwrócić dowolny wynik z parsowanej analizy enum.
Stamtąd jest tylko kwestia użycia funkcji analizy składni i użycia nowej, silnie wpisanej zmiennej.
const strongIssueType: IssueType = parseIssueType('ACTION');
// IssueType.ACTION
const wrongIssueType: IssueType = parseIssueType('UNEXPECTED');
// IssueType.UNKNOWN
--noImplicitAny
(w VS niezaznaczone „Zezwól domyślnie na dowolne” typy). To produkujeerror TS7017: Index signature of object type implicitly has an 'any' type.
dla mnie to działało:var color: Color = (<any>Color)[green];
(testowane z wersją 1.4)