我有Base类,它定义了style和styleType属性。有一个Better类扩展了Base类,它用另一个值覆盖styleType。
是否可以在Base类中创建样式的实例,该样式是在Better类中定义的styleType?
而且,第二个问题 - 在Base类中可以获得样式的样式返回样式的正确类型(BetterStyle,如果它是BetterBase实例)吗?
class Base {
styleType:typeof Style = Style;
private _style:Style;
constructor(){
this._style = new this.styleType();
}
// how to define return type so that it would beof styleType?
public get style():Style{
return this._style;
}
}
class Style{
public color;
}
class BetterBase extends Base{
styleType:typeof BetterStyle = BetterStyle;
}
class BetterStyle extends Style{
public betterColor;
}
var betterBase = new BetterBase();
betterBase.style.color = "#FF0000";
console.log(betterBase.style); // incorrect, outputs Style, not BetterStyle
console.log(betterBase.styleType);
答案 0 :(得分:2)
基本上你正在做的是从构造函数调用虚方法,这是禁忌,因为基类构造函数必须在派生类初始化发生之前完成。解决方案是将执行推迟到以后,以便派生类可以覆盖基类值:
class Base {
styleType:typeof Style = Style;
private _style:Style;
constructor(){ }
// Lazy initialization
public get style():Style{
return this._style || (this.style = new this.styleType());
}
}