2017-11-13 1 views
1

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)); 
    } 
} 

答えて

2

ありがとうございます。したがって、TBはすべてTransformedBaseですが、すべてTransformedBaseは必ずしもTBではありません。したがってtransform()の実装はBaseTransformerには間違っています。 TBの新しいインスタンスを返す必要がありますが、コンストラクタはありません。

BaseTransformerの実装もありません。かなり役に立たないためです。たぶんBaseTransformerは、代わりに抽象クラスまたはインタフェースでなければなりません。

希望があれば、がんばろう!

+0

実際のコードでは、Base&TransformedBaseには実際の情報が含まれているため、BaseTransformerは実際の作業を行い、BetterTransformerはBetterからデータを変換する必要がありますが、Baseからのデータは変換しません。 「すべてのTransformedBaseが必ずTBです」というご支援をいただきありがとうございます。私はそれについて考えませんでしたが、それはかなり論理的です。 –

関連する問題