【问题标题】:Iterate over enum items in Typescript迭代 Typescript 中的枚举项
【发布时间】:2020-12-26 18:20:23
【问题描述】:

如何在 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'
}

【问题讨论】:

  • 您可以像@Mark Skelton 提到的那样做,也可以通过this.doCalculation(FooType[foo]) 简单地遍历数组(枚举类型)

标签: typescript enums


【解决方案1】:

您应该能够使用for ofObject.values 完成此操作。

for (const value of Object.values(FooType)) {
  // here I have error that string is not assignable to parameter of type FooType
  doCalculation(value)
}

【讨论】:

    【解决方案2】:

    枚举被翻译成这种类型的对象:

    "use strict";
    var SupportedFiat;
    (function (SupportedFiat) {
        SupportedFiat["VALUE_A"] = "VALUE_A";
        SupportedFiat["VALUE_B"] = "VALUE_B";
        SupportedFiat["VALUE_C"] = "VALUE_C";
    })(SupportedFiat || (SupportedFiat = {}));
    

    Playground link

    不幸的是,Typescript 枚举并没有真正实现迭代器以便于迭代,因此您需要自己制作:

    function* supportedFiatValues(): IterableIterator<SupportedFiat> {
        yield SupportedFiat.VALUE_A;
        yield SupportedFiat.VALUE_B;
        yield SupportedFiat.VALUE_C;
    }
    
    for (const supportedFiat of supportedFiatValues()) {
    // ...
    }
    

    可以使用Object.values(),但在那里您会丢失类型信息,恕我直言,生成器方法为您带来更好的类型推断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 2011-02-07
      • 1970-01-01
      • 2011-10-06
      • 2017-02-03
      • 2017-05-12
      相关资源
      最近更新 更多