【问题标题】:Iterate over enum as named constants (not values!)迭代枚举作为命名常量(不是值!)
【发布时间】:2020-03-17 22:53:33
【问题描述】:

我找到了 manyposts 关于如何为 TypeScript 枚举获取可能的数组,但我想要一个类型化命名常量的数组。

这个 TypeScript 新手很可能使用了错误的术语/单词,这是问题的一部分......

enum Color {
    RED = "red",
    GREEN = "green"
}

// Object.keys(Color) gives me ["RED", "GREEN"] as strings but I want:
const allColors = new Array<Color>(Color.RED, Color.GREEN);

function takesColor(color: Color) {
    console.log("Color is", color);
}

// So I can iterate over all colors and call takesColor() like so:
for (let color of allColors) {
    takesColor(color);
}

如何在不明确列出每个成员的情况下创建allColors?我上面的allColors 不干。

【问题讨论】:

    标签: typescript enums


    【解决方案1】:

    试试:

    // These two are the same type
    const allColors : Color[] = new Array<Color>(Color.RED, Color.GREEN);
    const allColors2: Color[] = Object.values(Color);
    

    如果插入中断,您会看到 allColors 和 allColors2 是同一个数组(["red", "green"]),并且您不必列出所有成员来创建 allColors2。

    【讨论】:

    • 啊。我现在看到您的 allColors2 变量具有编译时 Typescript 类型 Color[] 而不是我想的那样:string[]。我冒昧地更新了您的代码示例,以使其更加清晰......
    • 没关系。 @Erik Philips 提出的观点(虽然忘记回答这个问题!)是底层 JavaScript 中的 Color[] IS string[] ,TypeScript 编译器试图通过在上面放置一个层来假装我们有适当的枚举支持那。如果您来自具有本机枚举的语言,您会发现 TypeScript 枚举因此有点棘手。
    • Color[] 是 string[] 在运行时而不是在编译时。
    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 2010-09-06
    • 2013-05-11
    • 1970-01-01
    • 2016-09-07
    • 2014-08-22
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多