TypeScript泛型在intellisense中显示但不编译

时间:2013-08-08 04:17:32

标签: generics backbone.js typescript

我正在尝试在骨干打字稿定义中使用泛型。为什么以下代码不起作用?!请在playground中尝试。

declare module Backbone {
    class Model{}

    interface ViewOptions<TModel extends Model> {
        model?: TModel;
    }

    class View<TModel extends Model> {
        constructor(options?: ViewOptions<TModel>);
        model: TModel;
    }
}

class MyModel extends Backbone.Model {
}

class MyView extends Backbone.View<MyModel> {
}

// Error: Could not select overload for 'new'' expression.
var myView = new MyView({ model: new MyModel(), num: 1 });

// In typescript playground when you hover on 'model' in
// previous line it correctly shows its type as 'MyModel'

var model = myView.model; // expected to be of type MyModel

更新

我认为如果我明确设置MyView的构造函数,编译器将会通过:

class MyView extends Backbone.View<MyModel> {
    constructor(options?: Backbone.ViewOptions<MyModel>) {
        super();
    }
}

但那么仿制药的用途是什么?!这是编译器中的缺陷吗?!

1 个答案:

答案 0 :(得分:1)

如果您没有指定构造函数,编译器需要TModel而不是MyModel,这是您尝试传递的内容。 看起来像编译器错误 您对泛型的理解是正确的。

另外请务必将参数传递给超类:

class MyView extends Backbone.View<MyModel> {
     constructor(options?: Backbone.ViewOptions<MyModel>) {
        super(options); // Pass this on 
    }
}