Typescriptはジェネリックで苦労します。このプロジェクトをコンパイルすると、return new TransformedBase();
でTS2322エラーが発生します(このプロジェクトはTypescriptのプレイグラウンドで実行できます)Typescript:GenericsクラスのTS2322
詳細については、コアプロジェクトを使用したプロジェクトがたくさんあります。目標は、可能な限りすべてをコアにし、角度注入を使用して各アプリの動作を変更することです。
TB extends TransformedBase
以降、私はnew TransformedBase()
を返していますが、なぜTypescriptはコンパイルを拒否していますか?あなたが知っているすべてはTB extends TransformedBase
が、その後TB
がサブタイプTransformedBase
のであるということであるならば
// 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));
}
}
実際のコードでは、Base&TransformedBaseには実際の情報が含まれているため、BaseTransformerは実際の作業を行い、BetterTransformerはBetterからデータを変換する必要がありますが、Baseからのデータは変換しません。 「すべてのTransformedBaseが必ずTBです」というご支援をいただきありがとうございます。私はそれについて考えませんでしたが、それはかなり論理的です。 –