接收" TypeError:this.cart.cases.get不是函数"即使函数存在

时间:2017-06-29 22:07:07

标签: dictionary typescript typeerror

尝试在我的Typescript控制器中对Map执行键/值查找时,收到以下错误:

  

TypeError:this.cart.cases.get不是函数

然而,"得到"肯定是为Typescript Map定义的。调用控制器如下所示:

export class CaseController{
    case: Case;
    cart: IShoppingCart;
    constructor(
        private $location: ng.ILocationService,
        private $mdDialog: ng.material.IDialogService,
        private $scope: any,
        private CaseService : CaseService,
        private shoppingCartService : ShoppingCartService
    ){
        "ngInject";
        var self = this;
        this.cartJSON = "";
        this.case = self.CaseService.getCase()
        this.cart = shoppingCartService.getCart();

    }

    public addDocument(doc:Document, caseForDoc:Case) {
      var myCase:Case = this.cart.cases.get(caseForDoc.caseId);//Error here
      if(!myCase){
        myCase = new Case(
            caseForDoc.id, 
            caseForDoc.caseNumber,
            caseForDoc.caseStyle, 
            caseForDoc.baseType,
            caseForDoc.status, 
            caseForDoc.fileDate,
            caseForDoc.caseId, 
            caseForDoc.location);
      }
      myCase.documents[doc.id.toString()] = doc;
      this.cart.cases.set(myCase.caseId, myCase);
      this.cartJSON = JSON.stringify(this.cart);
      this.shoppingCartService.updateCart(this.cart);    
    }
}

"例"是一个地图,在IShoppingCart中定义,看起来像这样:

export class ShoppingCart implements IShoppingCart {
    public cases: Map<number, Case>; //Mapped to caseid
     constructor(
        public id: number,
        public userIdentifier: string,
        public emailAddress: string,
        public convenienceFee: number,
        public orderTotal: number,
    ) {
        this.cases = new Map<number,Case>();
    }

所有代码编译都很好。有什么想法吗?

编辑:在视图中调用addDocuments,如下所示:

<md-card ng-repeat="(docID, doc) in vm.case.documents" layout="column" 
class="table-card" style="margin-top:0; margin-bottom:0; border-top:1px solid #ddd; border-bottom:1px solid #ddd;">
        <md-card-content>
            <div layout="row">
                <div flex-sm="100" flex-md="50" flex-lg="33" flex-gt-lg="33">
                    <tt-label-container>
                        <md-button class="md-primary md-hue-1" ng-click="vm.previewDoc($event)">
                             {{doc.documentName}}
                        </md-button>

                    </tt-label-container>
                </div>
                <div flex-sm="100" flex-md="50" flex-lg="33" flex-gt-lg="33">
                    <tt-label-container>
                        <div>{{doc.date | date: 'MM/dd/yyyy'}}</div>
                    </tt-label-container>
                </div>
                <div flex-sm="100" flex-md="50" flex-lg="33" flex-gt-lg="33">
                    <tt-label-container>
                        <div>{{doc.numberOfPages}}</div>
                    </tt-label-container>
                </div>
                <div flex-sm="100" flex-md="50" flex-lg="33" flex-gt-lg="33">
                    <tt-label-container>
                        <div>{{doc.price | currency: '$'}}</div>
                    </tt-label-container>
                </div>
                <div flex-sm="100" flex-md="50" flex-lg="33" flex-gt-lg="33">
                    <tt-label-container>
                        <div>
                            <md-button class="md-raised md-primary" ng-click='vm.addDocument(doc, vm.case)'>
                                <span>{{add.selected ? 'Remove' : 'Add'}}</span>
                            </md-button>
                        </div>
                    </tt-label-container>
                </div>
            </div>
        </md-card-content>
    </md-card>

1 个答案:

答案 0 :(得分:0)

尝试执行此操作以检查案例属性是否真的是地图

this.cart = shoppingCartService.getCart();
console.log(this.cart.cases instanceof Map);

如果日志为“false”,您必须检查 shoppingCartService.getCart()如何获取购物车。我不能假设这种方法的实现,但我感觉你通过网络获得购物车并反序列化它。在运行时确保返回的对象和属性是否是您期望的属性(即使您明确键入结果变量)。

实际上你也可以检查

this.cart = shoppingCartService.getCart();    
console.log(this.cart instanceof IShoppingCart);

你可能会对结果感到惊讶:)