TypeScript:推断抽象方法的类型';实施
我希望有一个具有属性的基类,其类型是从方法的返回值推断出来的,该方法由子类实现 因此,基类可以是这样的smg:TypeScript:推断抽象方法的类型';实施,typescript,typescript-typings,typescript-generics,Typescript,Typescript Typings,Typescript Generics,我希望有一个具有属性的基类,其类型是从方法的返回值推断出来的,该方法由子类实现 因此,基类可以是这样的smg: abstract class MyBase<T> { protected myProperty: T; constructor() { this.myProperty = this.getValueForMyProperty(); } protected abstract getValueForMyProperty():
abstract class MyBase<T> {
protected myProperty: T;
constructor() {
this.myProperty = this.getValueForMyProperty();
}
protected abstract getValueForMyProperty(): T;
}
class MyDescendant extends MyBase<MyDescendant> {
public getValueForMyProperty() {
return {
prop1: "smg"
};
}
}
我可以在TypeScript中执行此操作吗?我有一个解决方案,它几乎就是您想要的。限制是,为了使其工作,getValueForMyProperty
必须是public
此设置的关键在于,我们使用T
来描述对象本身,而不是使用泛型T
来描述返回类型。这样,我们可以创建如下特定实例:
abstract class MyBase<T> {
protected myProperty: T;
constructor() {
this.myProperty = this.getValueForMyProperty();
}
protected abstract getValueForMyProperty(): T;
}
class MyDescendant extends MyBase<MyDescendant> {
public getValueForMyProperty() {
return {
prop1: "smg"
};
}
}
Typescript接口仅描述对象的公共属性
,不能使用受保护
或私有
等修饰符。这就是为什么此设置要求mydegent
上的getValueForMyProperty
方法必须是公共的。否则它将无法实现所需的接口
不知何故,我在用public
方法实现protectedabstract
方法时没有出错?这似乎是一个错误,所以我也从MyBase
中删除了protected
MyBase的类型现在有点混乱,但这没关系,因为这只是一个地方
abstract class MyBase<T extends CanGetProperty> {
protected myProperty: ReturnType<T['getValueForMyProperty']>;
constructor() {
this.myProperty = this.getValueForMyProperty();
}
abstract getValueForMyProperty(): ReturnType<T['getValueForMyProperty']>;
}
抽象类MyBase{
受保护的myProperty:ReturnType;
构造函数(){
this.myProperty=this.getValueForMyProperty();
}
抽象getValueForMyProperty():ReturnType;
}
我在中进行了测试,我得到了关于不同类型的后代的返回类型的良好推断。非常感谢,这对我来说非常完美:)
abstract class MyBase<T extends CanGetProperty> {
protected myProperty: ReturnType<T['getValueForMyProperty']>;
constructor() {
this.myProperty = this.getValueForMyProperty();
}
abstract getValueForMyProperty(): ReturnType<T['getValueForMyProperty']>;
}