找不到属性angular2和打字稿

时间:2017-09-01 10:44:43

标签: angular typescript

我有一个api,它返回给我一个json,我把响应转发给我的班级,这个工作正常。但是json并没有在类中包含一些varibales,我希望这些变量在没有设置的情况下用null初始化。但他们根本没有出现(他们消失了),我得到一个例外,他们不在那里他们应该在那里。请解释为什么会发生这种情况会非常令人满意。

export class CustomPurchaseOrderProduct {
  constructor(
    public productId: number,
    public productName: string,
    public warehouseName: string,
    public binLocationCode: string,
    public amountInStock: number,
    public sellingPrice: number,
    public productTaxRate: number,
    public calculatedTax: number,
    public unitPrice: number,
    public discount: number
  ) {}
}

  getCustomProductOrders() {
const url = `${this.localUrl}purchaseOrderProducts`;
return this.http.get(url)
  .map(response => <CustomPurchaseOrderProduct[]>response.json());

}

  getAllPurchaseOrderProducts() {
this.purchaseOrderService.getCustomProductOrders()
    .subscribe(
      response => this.customPurchaseOrderProducts = response
    );

}

console.log('This is form Object', this.customPurchaseOrderProducts[index].calculatedTax);

数组中的JSON对象

{
"productId": 8,
"productName": "Akomka ",
"warehouseName": null,
"binLocationCode": null,
"amountInStock": 0,
"sellingPrice": 0,
"productTaxRate": 10,
"unitPrice": 0

}

所以我希望我的CalculatedTax,UnitPrice和Discount为null但是当我控制台登录对象时它们不在那里

当我控制台登录时,calculatedTax和其他变量不在对象中。

1 个答案:

答案 0 :(得分:0)

通过这样做:

.map(response => <CustomPurchaseOrderProduct[]>response.json());

您只是告诉编译器您知道数据的形状,并确信它与您的类匹配。如果您在控制台上记录响应,您可以看到它是一个简单的POJO并将控制日志Object {...},因此它实际上不是您班级的实例。

如果你真的希望它是你的类的一个实例并且具有可能不存在的属性,那么你可以像注释中提到的那样将它们作为可选属性。如果该属性不存在,则分配null值。所以你的缩短课程:

export class CustomPurchaseOrderProduct {
  private productId: number;
  private productName: string;
  private calculatedTax?: number;

  constructor(
    productId: number,
    productName: string,
    calculatedTax?: number

) {
    this.productId = productId;
    this.productName = productName;
    this.calculatedTax = calculatedTax || null
  }
}

因此,我们将calculatedTax标记为可选,如果它不在响应中,我们会将null分配给该属性。请注意,您需要在构造函数中将可选属性标记为last。

然后在http请求中,您需要将传入数据创建为类的实例,因此您需要执行以下操作:

getCustomProductOrders() {
  const url = `${this.localUrl}purchaseOrderProducts`;
  return this.http.get(url)
   .map(response => <CustomPurchaseOrderProduct[]>response.json()
     .map(data => 
      new CustomPurchaseOrderProduct(data.productId, data.productName, data.calculatedTax)
     )
   )
}

使用类与接口是一个值得商榷的问题,有些更喜欢接口,有些类更喜欢。所以你也可以使用接口,但仅此一点并不能解决问题。当您获得响应,迭代数据并检查对象中是否存在属性时,也可以解决此问题,如果没有,则使用null进行分配。但上面的解决方案是使用类:)