Backbone.js 通过每个迭代的BackboneJS集合返回默认模型,而不是精确定义的模型

Backbone.js 通过每个迭代的BackboneJS集合返回默认模型,而不是精确定义的模型,backbone.js,model-view-controller,typescript,underscore.js,underscore.js-templating,Backbone.js,Model View Controller,Typescript,Underscore.js,Underscore.js Templating,我需要一些帮助。我已经在BackboneJS中定义了模型和集合 export class MyModel extends Backbone.Model { constructor(options?) { this.urlRoot = 'apiURL/getmymodel'; this.idAttribute = 'ID'; super(options); } myMethod(): any { ...

我需要一些帮助。我已经在BackboneJS中定义了模型和集合

export class MyModel extends Backbone.Model {
    constructor(options?) {
        this.urlRoot = 'apiURL/getmymodel';
        this.idAttribute = 'ID';
        super(options);
    }

    myMethod(): any {
        ...
    }
}

export class MyCollection extends Backbone.Collection {
    model = MyModel;
    url = 'apiURL/getmycollection';
}
在下划线JS模板中,我想像这样调用MyModel方法myMethod()

myCollection.each(function(myModel) {
    myModel.myMethod();
}
但我在调用myMethod()时遇到异常


是我做错了什么,还是无法将集合中的模型强制转换为定义的类型?如果没有,为什么还要定义集合项的类型?

您会遇到此错误,因为Typescript编译器认为
myModel
的类型是
Backbone.Model
,就像您的代码是:

myCollection.each(function(myModel: Backbone.Model) {  // Error!
    myModel.myMethod();
});
它失败,因为
myMethod()
Backbone.Model
上不存在。主干类型定义在
Backbone.d.ts
文件中定义

要解决此问题,您需要通过指定模型类型来帮助Typescript进行类型推断:

myCollection.each(function(myModel: MyModel) {  // Works as you expect
    myModel.myMethod();
});
编辑:好的,我确实在一个typescript文件中重新创建了它,所以它在那个上下文中工作

我认为解决这个问题的最佳方法是直接在
原型上定义
模型
属性:

export class MyCollection extends Backbone.Collection {
    url = 'apiURL/getmycollection';
}
MyCollection.prototype.model = MyModel;

现在,可以通过像这样的模型转换来解决这个问题
myModel=newmymodel(myCollection.models[i].attributes)
。但这不是我想为每一个人做的事。你在问题上有你所需要的一切。我正确地调用了所有的东西,但有一个问题,即使在调用
myCollection.get('modelCID')
时,我也得到了类Backbone.Model的实例,而不是类MyModel的实例。这不是问题,因为我在下划线JS模板中的纯javascript中执行每个over集合,因此,Typescript不会与此代码发生冲突。即使在调试代码时,我也可以看到集合类型为
MyCollection
,但我得到的模型是
Backbone.model
export class MyCollection extends Backbone.Collection {
    url = 'apiURL/getmycollection';
}
MyCollection.prototype.model = MyModel;