Как перебирать элементы перечисления в TypeScript? Я пробовал for-in, но это перебирает строки. Мне нужно вызвать функцию для каждого значения перечисления.
for (const foo in FooType) {
// here I have error that string is not assignable to parameter of type FooType
this.doCalculation(foo)
}
private doCalculation(value: FooType): void {
// some logic
}
перечисление FooType
выглядит так:
export enum SupportedFiat {
VALUE_A = 'VALUE_A',
VALUE_B = 'VALUE_B',
VALUE_C = 'VALUE_C'
}
Вы должны быть в состоянии сделать это, используя for of
и Object.values
.
for (const value of Object.values(FooType)) {
// here I have error that string is not assignable to parameter of type FooType
doCalculation(value)
}
перечисления переводятся в этот тип объекта:
"use strict";
var SupportedFiat;
(function (SupportedFiat) {
SupportedFiat["VALUE_A"] = "VALUE_A";
SupportedFiat["VALUE_B"] = "VALUE_B";
SupportedFiat["VALUE_C"] = "VALUE_C";
})(SupportedFiat || (SupportedFiat = {}));
к сожалению, перечисления Typescript на самом деле не реализуют итератор для легкой итерации, поэтому вам нужно сделать свой собственный:
function* supportedFiatValues(): IterableIterator<SupportedFiat> {
yield SupportedFiat.VALUE_A;
yield SupportedFiat.VALUE_B;
yield SupportedFiat.VALUE_C;
}
for (const supportedFiat of supportedFiatValues()) {
// ...
}
Вы можете использовать Object.values()
, но вы потеряете там информацию о типе, ИМХО, подход с генератором дает вам лучший вывод типа.
Вы можете сделать либо так, как упоминал @Mark Skelton, либо просто перебрать массив (тип Enum), выполнив
this.doCalculation(FooType[foo])