Angular Typescript中的枚举问题
尝试初始化一个对象并尝试理解一些怪癖。首先,我想使用。我在枚举方面遇到了一些奇怪的怪癖 考虑以下类型层次结构:Angular Typescript中的枚举问题,angular,typescript,Angular,Typescript,尝试初始化一个对象并尝试理解一些怪癖。首先,我想使用。我在枚举方面遇到了一些奇怪的怪癖 考虑以下类型层次结构: enum CalcType { EXPRESS, EXPRESS_LESS_EARNED, COST_BASIS } interface Program { active: boolean; code: string; displayOrder: number; dpld: boolean; calcType: CalcType; } this.p
enum CalcType {
EXPRESS,
EXPRESS_LESS_EARNED,
COST_BASIS
}
interface Program {
active: boolean;
code: string;
displayOrder: number;
dpld: boolean;
calcType: CalcType;
}
this.p = <Program> {
active: false,
displayOrder: 100,
dpld: true,
calcType: CalcType[CalcType.EXPRESS_LESS_EARNED], // Does not work in Angular!!
//calcType: CalcType['1'] // Works, value is a string
//calcType: CalcType.EXPRESS_LESS_EARNED // Works, value is the ordinal
};
但是,如果我使用CalcType.EXPRESS\u LESS\u owned或CalcType['1'],它可以正常工作
JSBin:
闪电战:
我错过了什么?我应该能够使用Enum[ordinal]语法来获取字符串值。此外,为什么它会抱怨在某些情况下缺少字段,而在其他情况下则没有
编辑:
问题在于,HTTP服务使用以下语法从JSON反序列化/序列化,其中resp是HttpResponse:
return resp.body as Program;
在反序列化过程中,JSON中的字符串被转换为等价的枚举字符串,而不是它们的序号。在序列化过程中,它们期望枚举的字符串等价物,否则它们只会被转换为服务器无法理解的数字
那么,如何让JSON根据枚举字段的字符串值或序号来转换枚举字段呢
i、 e.下游“EXPRESS”应转换为CalcType.EXPRESS或1
上游CalcType.EXPRESS或1应转换为“EXPRESS”TLDR:
将界面更改为以下内容:
Type '{ active: false; displayOrder: number; dpld: true; calcType: string; }' cannot be converted to type 'Program'.
Property 'code' is missing in type '{ active: false; displayOrder: number; dpld: true; calcType: string; }'.
interface Program {
active: boolean;
code?: string;
displayOrder: number;
dpld: boolean;
calcType: string;
}
完整答案
我不能确切地回答为什么会发生这种情况,但我可以说如何解决您的一些问题
您已指定Program
具有非可选参数code
,但未将该参数提供给this.p
。如果您将code
设置为可选(code?:string;
),则会使错误消息消失,然后您得到真正的问题(实际上不是问题!)
就Typescript而言,CalcType.EXPRESS\u LESS\u needed
和CalcType['1']
都返回类型为CalcType
的对象CalcType[CalcType.EXPRESS\u LESS\u owned]
的返回类型为string
。您将字符串
分配给calcType
而不是calcType
违反了程序
接口。如果将其更改为calcType:string代码>然后剩下的问题就消失了
至于你说的CalcType[CalcType.EXPRESS\u LESS\u owned]
不起作用,我已经在Typescript 2.61和2.71中对它进行了测试,这两次它都正确地等同于字符串的“EXPRESS\u LESS\u owned”TLDR:
将界面更改为以下内容:
Type '{ active: false; displayOrder: number; dpld: true; calcType: string; }' cannot be converted to type 'Program'.
Property 'code' is missing in type '{ active: false; displayOrder: number; dpld: true; calcType: string; }'.
interface Program {
active: boolean;
code?: string;
displayOrder: number;
dpld: boolean;
calcType: string;
}
完整答案
我不能确切地回答为什么会发生这种情况,但我可以说如何解决您的一些问题
您已指定Program
具有非可选参数code
,但未将该参数提供给this.p
。如果您将code
设置为可选(code?:string;
),则会使错误消息消失,然后您得到真正的问题(实际上不是问题!)
就Typescript而言,CalcType.EXPRESS\u LESS\u needed
和CalcType['1']
都返回类型为CalcType
的对象CalcType[CalcType.EXPRESS\u LESS\u owned]
的返回类型为string
。您将字符串
分配给calcType
而不是calcType
违反了程序
接口。如果将其更改为calcType:string代码>然后剩下的问题就消失了
至于你说的CalcType[CalcType.EXPRESS\u LESS\u-owned]
不起作用,我已经在Typescript 2.61和2.71中对它进行了测试,这两次它都正确地等同于字符串的“EXPRESS\u LESS\u-owned”这主要是Typescript的问题。它会在任何地方导致错误,而不仅仅是在角度上。它在JSBin中工作,因为它忽略编译错误
这里有两个不同的问题,分别是calcType
和code
属性
问题是这里使用的枚举不正确,这可以通过类型检查检测到
CalcType
enum被删除为:
var CalcType;
(function (CalcType) {
CalcType[CalcType["EXPRESS"] = 0] = "EXPRESS";
CalcType[CalcType["EXPRESS_LESS_EARNED"] = 1] = "EXPRESS_LESS_EARNED";
CalcType[CalcType["COST_BASIS"] = 2] = "COST_BASIS";
})(CalcType || (CalcType = {}));
它提供属性名称及其各自数值的映射,并在对象中生成结果:
然而,这是,枚举值应该是数字
这是类型错误,枚举值应该是数字,而CalcType[CalcType.EXPRESS\u LESS\u revenued]
是字符串:
calcType: CalcType[CalcType.EXPRESS_LESS_EARNED]
这只会禁用类型检查:
calcType: CalcType['1']
这是使用枚举的方式,因此它可以工作:
calcType: CalcType.EXPRESS_LESS_EARNED
如果您应该能够使用Enum[ordinal]语法来获取字符串值,那么必须使用,并且字符串值应该明确定义:
enum CalcType {
EXPRESS = 'EXPRESS',
...
}
这样一来,它与普通对象没有什么不同:
const CalcType = {
EXPRESS: 'EXPRESS',
...
};
此错误表示对象没有代码
,而它应该存在于程序中
:
类型{active:false;displayOrder:number;dpld:true;calcType:string;}中缺少属性“code”
这主要是类型脚本问题。它会在任何地方导致错误,而不仅仅是在角度上。它在JSBin中工作,因为它忽略编译错误
这里有两个不同的问题,分别是calcType
和code
属性
问题是这里使用的枚举不正确,这可以通过类型检查检测到
CalcType
enum被删除为:
var CalcType;
(function (CalcType) {
CalcType[CalcType["EXPRESS"] = 0] = "EXPRESS";
CalcType[CalcType["EXPRESS_LESS_EARNED"] = 1] = "EXPRESS_LESS_EARNED";
CalcType[CalcType["COST_BASIS"] = 2] = "COST_BASIS";
})(CalcType || (CalcType = {}));
它提供属性名称及其各自数值的映射,并在对象中生成结果:
然而,这是,枚举值应该是数字
这是类型错误,枚举值应该是数字,而CalcType[CalcType.EXPRESS\u LESS\u revenued]
是字符串:
calcType: CalcType[CalcType.EXPRESS_LESS_EARNED]
这只会禁用类型检查:
calcType: CalcType['1']
这是使用枚举的方式,因此它可以工作:
calcType: CalcType.EXPRESS_LESS_EARNED
如果您应该能够使用枚举[