向枚举添加描述属性,并在TypeScript中读取此描述
我想知道如何在TypeScript中向enum添加描述属性。 我想按如下方式创建enum(或类似的内容): 为了能够对这样的枚举执行基本操作,我将创建泛型EnumHelper。此帮助器类应包含允许以下操作的方法:获取描述值、名称和数值。问题是如何在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
- 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",
};