2013-03-31 52 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 }); 

然後骨幹將能夠像預期的那樣創建一個模型。

爲什麼它會發生,我不知道:( 在類型上可以定義的錯誤。