return new TransformedBase();
得到一个TS2322错误(你可以在Typescript游乐场中使用c / c这个项目,它可以工作)
对于更多上下文,我们有很多使用Core项目的项目。我们的目标是将所有我们可以融入Core,并使用Angular注入来改变每个应用程序中的行为。
自TB extends TransformedBase
以来,我正在返回new TransformedBase()
为什么Typescript拒绝编译?
谢谢
// Projet 'Core'
class Base {
a: string;
}
class TransformedBase {
z: string;
}
class BaseTransformer<B extends Base, TB extends TransformedBase> {
transform(source: B): TB {
return new TransformedBase();
}
}
class GenericService<B extends Base, TB extends TransformedBase> {
private transformer: BaseTransformer<B, TB>;
constructor(transformer: BaseTransformer<B, TB>) {
// transformer is injected
this.transformer = transformer;
}
doWork(source: B): TB {
return this.transformer.transform(source)
}
}
// One of the project which use Core
// import Base from 'core/Base'
// import TransformedBase from 'core/TransformedBase'
// import BaseClass from 'core/BaseClass'
class Better extends Base {
b: string;
}
class TransformedBetter extends TransformedBase {
w: string;
constructor(transformedBase: TransformedBase) {
super();
// Do something
this.w = `Hello ${transformedBase.z}`;
}
}
class BetterTransformer extends BaseTransformer<Better, TransformedBetter> {
transform(source: Better): TransformedBetter {
super.transform(source);
return new TransformedBetter(super.transform(source));
}
}
答案 0 :(得分:2)
如果您只知道TB extends TransformedBase
,那么TB
就是TransformedBase
的子类型。因此,每个TB
都是TransformedBase
,但不是每个TransformedBase
都必须是TB
。因此transform()
中BaseTransformer
的实施不正确。您需要返回TB
的新实例,但您没有任何构造函数。
我建议甚至没有BaseTransformer
的实现,因为它没用。也许BaseTransformer
应该是抽象类或接口。
希望有所帮助;祝你好运!