【问题标题】:Iterate over generic enum Types Typescript迭代通用枚举类型 Typescript
【发布时间】:2021-02-13 14:57:18
【问题描述】:

我偶然发现了一个问题,即我需要遍历泛型枚举类型。 我正在尝试获取枚举类型的值。

for 循环参数中 GetPaths 函数中的 Typescript 错误:

"'T' 只指一个类型,但在这里被用作一个值"

export enum ERoutingPaths {
  Home = "/",
  About = "/About"
}

export enum EGamePaths {
  Snake = "/Snake",
  Maze = "/Maze",
}

 function GetPaths<T extends ERoutingPaths | EGamePaths>():any {
  let result = "";
  for (let item in Object.values(T))  {
    result += item + "|";
  }
  return result;
}

如果我还有其他枚举类型,我如何创建一个允许我迭代通用枚举类型的函数?

【问题讨论】:

    标签: reactjs typescript generics enums


    【解决方案1】:

    具有字符串值的枚举是旧的纯 JavaScript 对象,具有严格的键值类型。您可以使用Record&lt;string, string&gt; 类型。

    function GetPaths(value: Record<string, string>): string {
      let result = "";
      for (let item in value) {
        result += value[item] + "|";
      }
      return result;
    }
    

    如果您只想在这里只允许一组严格的类型,您可以保留泛型并使用:T extends typeof ERoutingPaths | typeof EGamePaths。注意一个词typeof——我们必须从枚举中提取一个类型。还需要再进行一项更改。

    for (let item in value) {
       result += value[item as keyof T] + "|";
    }
    

    TypeScript 将 item 类型扩展为 string - 编译器不允许使用带有枚举的字符串,所以我将其转换回 keyof T

    【讨论】:

    • 我宁愿选择第二个选项,因为我喜欢自动完成功能,它让我更不容易出现拼写错误。但是我从哪里获得价值呢?我只想告诉函数它是哪种类型并请求一个包含枚举中所有字符串值的字符串。
    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2018-07-15
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多