【问题标题】:Create enum instance by string in Typescript在 Typescript 中按字符串创建枚举实例
【发布时间】:2017-06-21 09:49:56
【问题描述】:

我正在尝试在 typescript 中提取数字枚举的枚举成员,但 window[name] 确实返回了一个未定义的对象。

export enum MyEnum {    
  MemberOne = 0,   
  MemberTwo = 1
}

export class ObjectUtils {
  public static GetEnumMembers(name: string): Array<string> {
    let enumInstance = window[name];

    return Object.keys(enumInstance).map((k: any) => enumInstance[k]).filter((x: any) => typeof (x) == "string");
  }
}

所以现在我这样调用 GetEnumMembers 方法:

ObjectUtils.GetEnumMembers("MyEnum");

enumInstance 结果未定义。

编辑: 我想返回一个带有 ["MemberOne", "MemberTwo"]

的字符串数组

【问题讨论】:

  • 请提供一个最小但完整的示例来说明您正在做什么。提供的代码 sn-p 留下未回答的问题。
  • 你能确定window[name]是什么,不是undefined吗?
  • window.MyEnum 未定义,因为导出未存储在 window 上。检查 TypeScript 编译器生成的 JavaScript 代码。
  • 抱歉,您知道如何解决我的问题吗?
  • 您可以传入枚举本身,而不仅仅是其名称。不确定这是否适合您。

标签: javascript typescript enums


【解决方案1】:

导出的成员不会添加到window,除非您自己添加。您可以重构代码以接受枚举本身而不是枚举名称:

export enum MyEnum {    
  MemberOne = 0,   
  MemberTwo = 1
}

// Some other file
import { MyEnum } from "./MyEnum"

class ObjectUtils {
  public static GetEnumMembers(e: {
    [key: string]: any
  }): Array<string> {
    return Object.keys(e).map((k: any) => e[k]).filter((x: any) => typeof (x) == "string");
  }
}

// And use it like:
console.log(ObjectUtils.GetEnumMembers(MyEnum));

【讨论】:

  • 这个想法是有一个接受字符串的通用函数,因为枚举类型是从数据库中提取的,所以我在编程时不知道它。
  • @nicknack123123 你需要知道枚举的位置。您可以使用代码中的字符串来执行此操作,但关键是枚举的位置。
猜你喜欢
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多