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
如果您应该能够使用枚举[