What I am trying to achieve:我希望使用接收类型T的值并返回SAVE VALUE的方法saveChanges
的BACIS ChangeListener
.我还想有ChangeListenerWithModifier
,覆盖ChangeListener
类,并扩展saveChanges
方法.在本例中,值类型为T,但它将不同的值类型传递给父saveChanges
方法.
class ChangeListener<T, R = T> {
changes: R;
saveChanges(value: T): R {
this.changes = value;
return value;
}
}
class ChangeListnerWithModifier<T, B> extends ChangeListener<B> {
constructor(private modifier: (value: T) => B) {
super();
}
saveChanges(value: T): B {
return super.saveChanges(this.modifier(value));
}
}
在我目前的设置中,我在ChangeListener
saveChanges方法中收到错误
类型‘T’不可赋值给类型‘R’. "R"可以用与"T"无关的任意类型实例化.此类型参数可能需要扩展R约束.
我理解这个错误,但这正是我需要的.我的返回类型可能与T相同,但它可以是完全不同的类型,而不是扩展T.
还有一个错误,那就是ChangeListnerWithModifier
个saveChanges方法
类型""ChangeListnerWithModifierT,B&>""中的属性""saveChanges""不能赋值给基本类型""ChangeListener<;B,B&>""中的同一属性."" 类型‘(Value:t)=>;B’不可分配给类型‘(Value:B)=>;B’. 参数‘Value’和‘Value’的类型不兼容. 类型‘B’不可赋值给类型‘T’. ‘t’可以用与‘B’无关的任意类型实例化.ts(2416)
我可以采用不同的方法,在ChangeListener
个父类中使用单一类型
class ChangeListener<T> {
changes: T;
saveChanges(value: T): T {
this.changes = value;
return value;
}
}
class ChangeListnerWithModifier<T, B> extends ChangeListener<B> {
constructor(private modifier: (value: T) => B) {
super();
}
saveChanges(value: T): B {
return super.saveChanges(this.modifier(value));
}
}
但是,扩展该类并使用不同的返回类型签名重写它的方法会出现问题.现在children类中的saveChanges给了我类型错误:
类型""ChangeListnerWithModifierT,B&>""中的属性""saveChanges""不能分配给基类型""ChangeListener""中的同一属性."" 类型‘(Value:t)=>;B’不可分配给类型‘(Value:B)=>;B’. 参数‘Value’和‘Value’的类型不兼容. 类型‘B’不可赋值给类型‘T’. ‘t’可以用与‘B’无关的任意类型实例化.ts(2416)