В этом вопросе много смешанной информации, поэтому давайте рассмотрим всю реализацию TypeScript 2.x + в Руководстве Ника по использованию Enums в моделях с TypeScript .
Это руководство предназначено для: людей, которые создают код на стороне клиента, который принимает набор известных строк с сервера, который будет удобно моделироваться как Enum на стороне клиента.
Определить перечисление
Давайте начнем с перечисления. Это должно выглядеть примерно так:
export enum IssueType {
REPS = 'REPS',
FETCH = 'FETCH',
ACTION = 'ACTION',
UNKNOWN = 'UNKNOWN',
}
Здесь следует отметить две вещи:
Мы явно объявляем их как регистры перечисления со строковыми данными, что позволяет нам создавать их с помощью строк, а не некоторых других не связанных чисел.
Мы добавили опцию , которая может или не может существовать на нашей модели сервера: UNKNOWN. Это может быть обработано так, как undefinedвы предпочитаете, но я бы хотел по возможности избегать | undefinedтипов, чтобы упростить обработку.
Самое замечательное в UNKNOWNслучае с кейсом состоит в том, что вы можете быть действительно очевидны в коде и делать стили для неизвестных перечисляемых случаев ярко-красными и мигающими, чтобы вы знали, что вы что-то неправильно обрабатываете.
Разобрать перечисление
Возможно, вы используете это перечисление, встроенное в другую модель, или все в одиночку, но вам придется проанализировать перечисление со строковым типом y из JSON или XML (ха) в свой строго типизированный аналог. При встраивании в другую модель этот синтаксический анализатор живет в конструкторе класса.
parseIssueType(typeString: string): IssueType {
const type = IssueType[typeString];
if (type === undefined) {
return IssueType.UNKNOWN;
}
return type;
}
Если перечисление правильно проанализировано, оно в конечном итоге будет иметь правильный тип. В противном случае это будет, undefinedи вы можете перехватить его и вернуть ваше UNKNOWNдело. Если вы предпочитаете использовать в undefinedкачестве неизвестного случая, вы можете просто вернуть любой результат из попытки разбора enum.
Оттуда, это только вопрос использования функции анализа и использования вашей новой строго типизированной переменной.
const strongIssueType: IssueType = parseIssueType('ACTION');
// IssueType.ACTION
const wrongIssueType: IssueType = parseIssueType('UNEXPECTED');
// IssueType.UNKNOWN
--noImplicitAny(в VS не отмечено «Разрешить неявные« любые »типы»). Она производитerror TS7017: Index signature of object type implicitly has an 'any' type.Для меня это работает:var color: Color = (<any>Color)[green];(протестирована с версией 1.4)