У цьому питанні є багато змішаної інформації, тому давайте висвітлимо всю реалізацію для 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як невідомий випадок, ви можете просто повернути будь-який результат від спроби синтаксичного аналізу.
Звідси лише питання використання функції розбору та використання вашої щойно сильної введеної змінної.
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)