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

Dictionary “接收”;TypeError:this.cart.cases.get不是函数";即使函数存在,dictionary,typescript,typeerror,Dictionary,Typescript,Typeerror,尝试在Typescript控制器中的映射上执行键/值查找时,我收到以下错误: TypeError:this.cart.cases.get不是函数 然而,“get”是为Typescript映射定义的。调用的控制器如下所示: export class CaseController{ case: Case; cart: IShoppingCart; constructor( private $location: ng.ILocationService,

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

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

然而,“get”是为Typescript映射定义的。调用的控制器如下所示:

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);    
    }
}
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>();
    }
“案例”是一个地图,在IShoppingCart中定义,如下所示:

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);    
    }
}
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>();
    }
导出类ShoppingCart实现了IShoppingCart{
公共案例:Map;//映射到caseid
建造师(
公众id:号码,
公共用户标识符:字符串,
公共电子邮件地址:string,
公共设施费:号码,
公共秩序总数:,
) {
this.cases=newmap();
}
所有的代码都编译得很好,有什么想法吗

编辑:在视图中调用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>

{{doc.documentName}
{{doc.date}日期:'MM/dd/yyyy'}
{{doc.numberOfPages}
{{doc.price}货币:'$'}
{{add.selected?'Remove':'add'}}

尝试这样做,以检查您的cases属性是否真的是一个映射

this.cart = shoppingCartService.getCart();
console.log(this.cart.cases instanceof Map);
如果日志为“false”,则必须检查shoppingCartService.getCart()如何获取购物车。我无法假设此方法的实现,但我感觉您通过网络获取购物车并对其进行反序列化。请确保在运行时返回的对象和所属属性是否确实是您所期望的(即使显式键入结果变量)

其实你也可以查一下

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

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

谁在调用
addDocument
?console.log()建议正是找到问题的关键。在getCases()方法中,ShoppingCart是从cookie(ng cookies)反序列化的然后读入this.cart。问题是,当ShoppingCart对象首先放入cookie时,映射作为简单的关联数组序列化为JSON,没有任何Map类的get/put方法。所以在运行时,我根本没有处理映射!