代码之家  ›  专栏  ›  技术社区  ›  kentor

在字符串枚举上迭代

  •  9
  • kentor  · 技术社区  · 8 年前

    我肯定遗漏了什么,但我找到了几种方法来迭代枚举,但不是在字符串枚举上。

    给出了以下枚举:

    export enum Locales {
      En = 'en',
      Fr = 'fr',
      De = 'de',
      Es = 'es',
      It = 'it',
      Nl = 'nl',
      No = 'no',
      Tr = 'tr',
    }
    

    我想要实现的目标:

    我想迭代该字符串枚举,以便得到值(!)。我所尝试的:

    for (const key of Object.keys(Locales)) {
      const locale: string = Locales[key];
      console.log(locale); // Should print 'en', 'fr' and so on
    }
    

    上述代码的问题:

    由于严格的tsconfig(不允许隐式anys),我无法将其编译为javascript。由于这不是我的项目,我也无法更改此tsconfig。它突出显示了 key 变量位于 Locales[key] 这个错误对我来说很有意义:

    [ts]元素隐式具有“any”类型,因为索引表达式为 不是“数字”类型。

    问题是:

    使用Typescript 2.6+迭代字符串枚举以获取其值的正确方法是什么?

    4 回复  |  直到 8 年前
        1
  •  12
  •   artem    8 年前

    正如betadeveloper所建议的那样,如果使用类型断言,就可以获得键的正确类型 as keyof typeof Locales . 或者您可以将其包装在类型安全的变体中 Object.keys() 功能如下:

    export enum Locales {
      En = 'en',
      Fr = 'fr',
      De = 'de',
      Es = 'es',
      It = 'it',
      Nl = 'nl',
      No = 'no',
      Tr = 'tr',
    }
    
    function enumKeys<E>(e: E): (keyof E)[] {
      return Object.keys(e) as (keyof E)[];
    }
    
    for (const key of enumKeys(Locales)) {
      const locale: string = Locales[key];
      console.log(locale); 
    }
    

    另外,我要说的是,老式的 for .. in 循环仍然有效:

    for (let key in Locales) {
        let locale = Locales[key];
        console.log(locale);
    }
    
        2
  •  8
  •   kentor    8 年前

    @Artem和@betadeveloper指出我可以使用 keyof typeof Locales 键入我的方法。我最终想出的解决方案如下:

    const keys: (keyof typeof Locales)[] = <(keyof typeof Locales)[]>Object.keys(Locales);
    for (const key of keys) {
      const locale: string = Locales[key];
      console.log(locale); // Prints 'en', 'fr' and so on
    }
    
        3
  •  2
  •   Dany Gagnon    8 年前

    洛达斯

    Lodash 是一个很好的选择,因为它易于使用,并且提供了一个易于理解的api。根据lodash方法, forIn 是您正在寻找的选项。得到 typescript declaration files ,您可以安装:

    npm install @types/lodash

    使用 福林 方法 价值 以及 钥匙 属于 Locales 对象

    import { forIn } from 'lodash'
    
    enum Locales {
      En = 'en',
      Fr = 'fr'
      // ...
    }
    
    forIn(Locales, (value, key) => console.log(value, key))
    
        4
  •  0
  •   cthulhu    5 年前

    再加上这个问题,因为我在寻找解决方案。

    最好的解决办法是使用 Object.values() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values

    Object.values(Locales).forEach((locale) => console.log(locale));
    
    // or
    
    for (const locale of Object.values(Locales)) {
      console.log(locale);
    }
    

    同时考虑 Object.entries() 获取字符串值枚举的键和值。

    推荐文章