TypeScript
Перечисления
Поиск…
Как получить все значения перечисления
enum SomeEnum { A, B }
let enumValues:Array<string>= [];
for(let value in SomeEnum) {
if(typeof SomeEnum[value] === 'number') {
enumValues.push(value);
}
}
enumValues.forEach(v=> console.log(v))
//A
//B
Перечисления с явными значениями
По умолчанию все значения enum
разрешены к номерам. Скажем, если у вас есть что-то вроде
enum MimeType {
JPEG,
PNG,
PDF
}
реальное значение, на которое MimeType.PDF
например, MimeType.PDF
будет 2
.
Но в некоторых случаях важно иметь разрешение перечисления на другой тип. Например, вы получаете значение из backend / frontend / другой системы, которая определенно является строкой. Это может быть болью, но, к счастью, существует такой метод:
enum MimeType {
JPEG = <any>'image/jpeg',
PNG = <any>'image/png',
PDF = <any>'application/pdf'
}
Это разрешает MimeType.PDF
для application/pdf
.
Так как TypeScript 2.4 можно объявить перечисления строк :
enum MimeType {
JPEG = 'image/jpeg',
PNG = 'image/png',
PDF = 'application/pdf',
}
Вы можете явно указать числовые значения, используя тот же метод
enum MyType {
Value = 3,
ValueEx = 30,
ValueEx2 = 300
}
Типы Fancier также работают, поскольку не-const перечисления являются реальными объектами во время выполнения, например
enum FancyType {
OneArr = <any>[1],
TwoArr = <any>[2, 2],
ThreeArr = <any>[3, 3, 3]
}
становится
var FancyType;
(function (FancyType) {
FancyType[FancyType["OneArr"] = [1]] = "OneArr";
FancyType[FancyType["TwoArr"] = [2, 2]] = "TwoArr";
FancyType[FancyType["ThreeArr"] = [3, 3, 3]] = "ThreeArr";
})(FancyType || (FancyType = {}));
Пользовательская реализация перечисления: расширяет для перечислений
Иногда требуется реализовать Enum самостоятельно. Например, нет четкого способа расширения других перечислений. Пользовательская реализация позволяет:
class Enum {
constructor(protected value: string) {}
public toString() {
return String(this.value);
}
public is(value: Enum | string) {
return this.value = value.toString();
}
}
class SourceEnum extends Enum {
public static value1 = new SourceEnum('value1');
public static value2 = new SourceEnum('value2');
}
class TestEnum extends SourceEnum {
public static value3 = new TestEnum('value3');
public static value4 = new TestEnum('value4');
}
function check(test: TestEnum) {
return test === TestEnum.value2;
}
let value1 = TestEnum.value1;
console.log(value1 + 'hello');
console.log(value1.toString() === 'value1');
console.log(value1.is('value1'));
console.log(!TestEnum.value3.is(TestEnum.value3));
console.log(check(TestEnum.value2));
// this works but perhaps your TSLint would complain
// attention! does not work with ===
// use .is() instead
console.log(TestEnum.value1 == <any>'value1');
Расширение перечислений без пользовательской настройки перечисления
enum SourceEnum {
value1 = <any>'value1',
value2 = <any>'value2'
}
enum AdditionToSourceEnum {
value3 = <any>'value3',
value4 = <any>'value4'
}
// we need this type for TypeScript to resolve the types correctly
type TestEnumType = SourceEnum | AdditionToSourceEnum;
// and we need this value "instance" to use values
let TestEnum = Object.assign({}, SourceEnum, AdditionToSourceEnum);
// also works fine the TypeScript 2 feature
// let TestEnum = { ...SourceEnum, ...AdditionToSourceEnum };
function check(test: TestEnumType) {
return test === TestEnum.value2;
}
console.log(TestEnum.value1);
console.log(TestEnum.value2 === <any>'value2');
console.log(check(TestEnum.value2));
console.log(check(TestEnum.value3));