我正在尝试在骨干打字稿定义中使用泛型。为什么以下代码不起作用?!请在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();
}
}
但那么仿制药的用途是什么?!这是编译器中的缺陷吗?!
答案 0 :(得分:1)
如果您没有指定构造函数,编译器需要TModel
而不是MyModel
,这是您尝试传递的内容。 看起来像编译器错误 您对泛型的理解是正确的。
另外请务必将参数传递给超类:
class MyView extends Backbone.View<MyModel> {
constructor(options?: Backbone.ViewOptions<MyModel>) {
super(options); // Pass this on
}
}