【问题标题】:TypeScript: Get member name of const enum as a string?TypeScript:将常量枚举的成员名称作为字符串获取?
【发布时间】:2018-08-16 14:33:36
【问题描述】:

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

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

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

在 C# 中,例如nameof(Snack.Orange)。 (我知道 typescript 不支持 nameof,而且我知道非常量枚举是如何实现的。)

【问题讨论】:

    标签: typescript


    【解决方案1】:

    默认情况下,常量枚举在编译时被完全删除,因此没有代表枚举的运行时对象。您可以使用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" },
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2018-07-05
      相关资源
      最近更新 更多