Typescript类型检查 - Backbone.Model实例无法进行类型检查

3

我在使用Typescript和Backbone Collections时遇到了问题。以下是一些基础知识:

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();

 });

在 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从未评估为true之外,因为似乎从Backbone.Model派生的'类类型'被分配给Backbone.Model.attributes而不是该类本身的实例。我认为这是因为在实现从Backbone.Model派生的类时,我遵循了这个方法,这似乎可能是这个问题的原因。基本上,它将TS类上的get/set属性委托给底层的Backbone.model.get()/set(),后者又将值设置在attributes属性上。
看起来我要么放弃这个方法(并希望那是问题所在),要么找出一种类似于或使用instanceof的松散耦合类型检查,介于baseChartModel.attributes对象和我的类原型之间App.BackBone.Models.ScatterPlotModel 此断点位于具有instanceof比较的行 enter image description here 有什么想法吗?
2个回答

1
你所使用的方法似乎是足够有效的。我只是为了检查几个JavaScript语义而已,将以下代码插入TypeScript Playground中:
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],导致实例失败?

希望这可以帮到您。


谢谢您尝试解决这个问题,虽然它还不完全是一个解决方案。我现在意识到这个问题的全部范围,所以我发布了一个单独的问题(https://dev59.com/zXDYa4cB1Zd3GeqPAXAb),以寻求更一般的解决方案。 - parliament

0

我猜我知道哪里出了“bug”:声明有些问题。

public model: CustomModelType

无法工作;

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

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

那么backbone将能够按预期创建模型。

为什么会发生这种情况,我不知道 :( 可能是类型定义中的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接