TypeScript:获取const enum的成员名称作为字符串?

时间:2018-03-08 09:33:58

标签: typescript

假设我有这个const枚举定义:

const enum Snack {
    Apple = 0,
    Banana = 1,
    Orange = 2,
    Other = 3
}

在我的打字稿代码中,可以获得其中一个成员的字符串文字吗?

在C#中它将是例如nameof(Snack.Orange)。 (我知道打字稿不支持这个名字,我知道非常规枚举的可能性。)

1 个答案:

答案 0 :(得分:3)

默认情况下,const枚举在编译时被完全删除,因此没有表示枚举的运行时对象。您可以使用preserveConstEnums强制生成枚举对象。问题是编译器仍然不允许您访问枚举对象,因此您必须使用解决方法来访问枚举。

启用preserveConstEnums后,我们可以将枚举放在命名空间中:

namespace enums {
    export const enum Snack {
        Apple = 0,
        Banana = 1,
        Orange = 2,
        Other = 3
    }
}
let enumName = (enums as any).Snack[enums.Snack.Apple];

或者枚举是否在模块内:

export const enum Snack {
    Apple = 0,
    Banana = 1,
    Orange = 2,
    Other = 3
}

let enumName = (exports as any).Snack[Snack.Apple];

如果您不想使用此标志,则可以创建一个对象,该对象将根据其定义包含枚举的所有成员,并且您可以在此对象中搜索该名称。如果你在枚举中添加或删除任何东西,你会在这个对象上得到编译时错误,这可能是一个可用的解决方法:

let SnackNames : { [P in keyof typeof Snack]: { Name: P, Value: typeof Snack[P] } } = {
    Apple : { Value: Snack.Apple, Name: "Apple" },
    Banana : { Value: Snack.Banana, Name: "Banana" },
    Orange : { Value: Snack.Orange, Name: "Orange" },
    Other : { Value: Snack.Other, Name: "Other" },
}