向枚举添加描述属性,并在TypeScript中读取此描述

向枚举添加描述属性,并在TypeScript中读取此描述,typescript,ecmascript-6,enums,Typescript,Ecmascript 6,Enums,我想知道如何在TypeScript中向enum添加描述属性。 我想按如下方式创建enum(或类似的内容): 为了能够对这样的枚举执行基本操作,我将创建泛型EnumHelper。此帮助器类应包含允许以下操作的方法:获取描述值、名称和数值。问题是如何在typescript中实现这一点?如果无法将属性添加到枚举,是否有其他方法? 我希望能够: - get number of enum value, - get description value, - get the name of enum f

我想知道如何在TypeScript中向enum添加描述属性。 我想按如下方式创建enum(或类似的内容):

为了能够对这样的枚举执行基本操作,我将创建泛型EnumHelper。此帮助器类应包含允许以下操作的方法:获取描述值、名称和数值。问题是如何在typescript中实现这一点?如果无法将属性添加到枚举,是否有其他方法? 我希望能够:

-  get number of enum value,
-  get description value,
-  get the name of enum field.
e、 g.对于样品IV,应为:

1, 
Blah IV, 
IV.

TypeScript不允许您向
enum
元素添加属性,该元素在运行时只是一个基本字符串或数字。相反,您必须创建一个新类型,该类型包含对这些元素的引用,并且还包含所需的方法或属性

这里有一种可能的方法。从简单的
enum
开始,如下所示:

enum SampleEnum {
  V, IV, III
}
让我们给出扩展类型的接口定义。它有一个
名称
、一个
说明
、一个
编号
。请注意,此类型是泛型的,因此我们可以很快缩小
名称
编号
类型的范围:

interface ISample<N extends number, S extends string> {
  readonly name: S;
  readonly description: string;
  readonly number: N;
}
这可能需要大量的类型转换,但基本上只是从
SampleEnum
中提取字符串值键(并忽略在运行时将数字键添加到数字枚举中的操作),并以某种类型安全的方式为每个扩展接口构建一个实例

最后,让我们创建代表我们的
枚举的
示例
值和类型:

const Sample = makeSample(SampleEnum);
type Sample = (typeof Sample)[keyof typeof Sample]
好的,让我们用它:

const nameOfIV = Sample.IV.name; // "IV"
console.log(nameOfIV); // "IV"
const numberOfIII = Sample.III.number; // SampleEnum.III
console.log(numberOfIII); // 1
const descriptionOfV = Sample.V.description; // string
console.log(descriptionOfV); // "Blah V"

const goodSample: Sample = Sample.III; // okay
const badSample: Sample = {
  name: "II", 
  description: "oops", 
  number: 3
}; // error, name doesn't match

在我看来是合理的。当然还有其他的方法,但这应该能给你一个想法。希望有帮助。祝你好运

这种模式对我很有效:

export enum PriceTypes {
    Undefined = 0,
    UndefinedDescription = 'Undefined' as any,
    UserEntered = 1,
    UserEnteredDescription = 'User Entered' as any,
    GeneratedFromTrade = 2,
    GeneratedFromTradeDescription = 'Generated From Trade' as any,
    GeneratedFromFreeze = 3,
    GeneratedFromFreezeDescription = 'Generated Rom Freeze' as any
}


另一个有趣的解决方案是使用ES6 Map:

export enum Sample {
  V,
  IV,
  III
}

export const SampleLabel = new Map<number, string>([
  [Sample.V, 'FIVE'],
  [Sample.IV, 'FOUR'],
  [Sample.III, 'THREE']
]);

已接受答案的变体。将
number
替换为
enum
类型,以提高类型安全性

 export enum Sample {
      V,
      IV,
      III
    }

export const SampleLabel = new Map<Sample, string>([
  [Sample.V, 'FIVE'],
  [Sample.IV, 'FOUR'],
  [Sample.III, 'THREE']
]);
导出枚举样本{
v
四,,
三,
}
export const SampleLabel=新地图([
[样本五,'五'],
[样本四,'四'],
[样本三,“三”]
]);

下面的方法将是类型安全的(自动完成工作),并使用普通对象。它是基于


我问这个问题的主要原因是想知道如何将带有描述的C#enum传输到角度选择器,其中值是enum的值,名称是enum的描述。可能在这种情况下,将c#enum转换为typescript类会更好更容易。谢谢你的描述性回答!枚举使用不当。UndefinedDescription不是有效的PriceType。这比映射解决方案IMO更优雅。我认为还应该给你一个编译错误,如果你错过了SampleLabel中的一个键?@DanKing Yes,它会给你一个错误
    GetDescription(e: any, id: number): string {
        return e[e[id].toString() + "Description"];
    }
    getPriceTypeDescription(price: IPricePoint): string {
        return this.GetDescription(PriceTypes, price.priceType);
    }
export enum Sample {
  V,
  IV,
  III
}

export const SampleLabel = new Map<number, string>([
  [Sample.V, 'FIVE'],
  [Sample.IV, 'FOUR'],
  [Sample.III, 'THREE']
]);
console.log(SampleLabel.get(Sample.IV)); // FOUR
 export enum Sample {
      V,
      IV,
      III
    }

export const SampleLabel = new Map<Sample, string>([
  [Sample.V, 'FIVE'],
  [Sample.IV, 'FOUR'],
  [Sample.III, 'THREE']
]);
export enum Sample {
  I = 1,
  II = 2,
  III = 3
}

export const SampleLabel: { [key in Sample]: string } = {
  [Sample.I]: "ONE",
  [Sample.II]: "TWO",
  [Sample.III]: "THREE",
};