打字稿:带有泛型类的TS2322

时间:2017-11-13 17:41:08

标签: typescript

打字稿给了我一些关于泛型的困难。在编译这个项目时,我在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));
    }
}

1 个答案:

答案 0 :(得分:2)

如果您只知道TB extends TransformedBase,那么TB就是TransformedBase子类型。因此,每个TB都是TransformedBase,但不是每个TransformedBase都必须是TB。因此transform()BaseTransformer的实施不正确。您需要返回TB的新实例,但您没有任何构造函数。

我建议甚至没有BaseTransformer的实现,因为它没用。也许BaseTransformer应该是抽象类或接口。

希望有所帮助;祝你好运!