2013-03-31 56 views
3

我遇到了Typescript和Backbone集合的问题。下面是一些基础:打字稿类型检查 - Backbone.Model实例无法进行类型检查

class BaseChartModel extends Backbone.Model { } 
class ScatterPlotModel extends BaseChartModel { } 
class BarChartModel extends BaseChartModel { } 

class MixedChartCollection extends Backbone.Collection { public model: BaseChartModel; ... } 
class ScatterPlotCollection extends Backbone.Collection { public model: ScatterPlotModel; ... } 
class BarChartCollection extends Backbone.Collection { public model: BarChartModel; ... } 

然后我执行以下操作:

var scatterPlotCollection = new ScatterPlotCollection(); 
var scatterPlotCollectionXhr = scatterPlotCollection.fetch({...}); 

var barChartCollection = new BarChartCollection(); 
var barChartCollectionXhr = barChartCollection.fetch({...}); 

$.when(scatterPlotCollectionXhr, barChartCollectionXhr).done(() => { 

     mixedCollection = new MixedChartCollection(); 
     mixedCollection.add(scatterPlotCollection.models, { silent: true }); 
     mixedCollection.add(barChartCollection.models, { silent: true }); 
     chartViewList = new MixedChartViewList({ collection: mixedCollection }); 

     chartViewList.render(); 

}); 

内部渲染():

public render(){ 
    var self = this; 
    this.$el.html(this.template({})); 

    this.collection.forEach(
    (chartModel: BaseChartModel) => { 
      this.$el.append(self.AddChartView(chartModel).render());     
    } 
); 

    return this; 
} 

public AddChartView(baseChartModel: BaseChartModel) : BaseChartView { 

     var newChartView: BaseChartView; 

     if(baseChartModel instanceof ScatterPlotModel){ 
      newChartView = new ScatterPlotView({ model: baseChartModel}); 
     } else if (baseChartModel instanceof BarChartModel){ 
      newChartView = new BarChartView({ model: baseChartModel}); 
     } 
     ....  
} 

除了instanceof从不计算正确的,因为它似乎是“类类型'来自Backbone.Model被赋值为Backbone.Model.attributes而不是类本身的一个实例。我相信这是因为在实现从Backbone.Model派生的类时,我遵循this的方法,并且似乎可能是此问题的原因。基本上它将TS类的get/set属性委托给基础的Backbone.model.get()/ set(),后者又设置attributes属性上的值。

看来我不得不要么放弃这一做法(希望这是问题),或者想出一个办法做类似或baseChartModel.attributes对象和我的类原型为App.BackBone.Models.ScatterPlotModel

之间使用 instanceof一个松散耦合的类型检查

这断点是在与instanceof比较 enter image description here

任何想法行了?

回答

1

您使用的方法似乎足够有效。我已经插入下面的代码到打字稿操场只是检查了几个JavaScript的symantics:

class A { } 

class B extends A { } 

class Checker { 
    static isA(input: A) { 
     return (input instanceof A); 
    } 
} 

var a = new A(); 
var b = new B(); 

document.writeln('a instanceof A ' + (a instanceof A) + '<br/>'); 
document.writeln('b instanceof B ' + (b instanceof B) + '<br/>'); 
document.writeln('b instanceof A ' + (b instanceof A) + '<br/>'); 
document.writeln('b instanceof A (via function) ' + Checker.isA(b) + '<br/>'); 

var aArray : A[] = []; 

aArray.push(a); 
aArray.push(b); 

for(var i = 0; i < aArray.length; i++) { 
    document.writeln('aArray[' + i + '] instance of A ' + (aArray[i] instanceof A) + '<br/>'); 
} 

这给出了以下的输出:

a instanceof A true 
b instanceof B true 
b instanceof A true 
b instanceof A checker true 
aArray[0] instance of A true 
aArray[1] instance of A true 

这必定意味着呼叫

mixedCollection.add(scatterPlotCollection.models, { silent: true }); 

在这里引起问题。
scatterPlotCollection.models可能不会返回您的原始对象(即ScatterPlotModel或BarChartModel),而只是返回[Object object],因此失败的实例?

希望这有助于

+0

感谢您抽出一展身手,在此,虽然它不是相当的解决方案。我现在意识到这个问题的全部范围,所以我发布了一个单独的问题(http://stackoverflow.com/questions/15775092/typescript-with-typelite-run-time-type-checking)以获得更一般的解决方案。 – parliament

0

我想我知道一个 '错误':不知何故声明

public model: CustomModelType 

不工作;

但是,如果您将创建这样一个集合:

new MyCustomCollection(null, { model: CustomModelType }); 

然后骨干将能够像预期的那样创建一个模型。

为什么它会发生,我不知道:( 在类型上可以定义的错误。