Я просто оголошую інтерфейс і використовую змінну цього типу для доступу до enum. Утримувати інтерфейс та enum у синхронізації насправді просто, оскільки TypeScript скаржиться на те, що в enum щось змінюється, як-от так.
помилка TS2345: Аргумент типу 'typeof EAbFlagEnum' не призначається параметру типу 'IAbFlagEnum'. Властивість "Перемістити" відсутня в типі "typeof EAbFlagEnum".
Перевага цього методу полягає в тому, що для використання enum (інтерфейсу) в різних ситуаціях не потрібне лиття типів, і таким чином підтримується більше типів ситуацій, таких як комутатор / випадок.
// Declare a TypeScript enum using unique string
// (per hack mentioned by zjc0816)
enum EAbFlagEnum {
None = <any> "none",
Select = <any> "sel",
Move = <any> "mov",
Edit = <any> "edit",
Sort = <any> "sort",
Clone = <any> "clone"
}
// Create an interface that shadows the enum
// and asserts that members are a type of any
interface IAbFlagEnum {
None: any;
Select: any;
Move: any;
Edit: any;
Sort: any;
Clone: any;
}
// Export a variable of type interface that points to the enum
export var AbFlagEnum: IAbFlagEnum = EAbFlagEnum;
Використання змінної, а не enum, дає бажані результати.
var strVal: string = AbFlagEnum.Edit;
switch (strVal) {
case AbFlagEnum.Edit:
break;
case AbFlagEnum.Move:
break;
case AbFlagEnum.Clone
}
Прапори були для мене ще однією необхідністю, тому я створив модуль NPM, який додає до цього прикладу, і включає тести.
https://github.com/djabraham/ts-enum-tools