2016-04-28 10 views
2

TypeScriptでAngular 2を使用してフロントエンドアプリケーションを構築しています。私は、ジェネリックリポジトリクラスを持っている:TypeScript、Angular 2依存性注入(継承あり)

export abstract class Repository<T extends IEntity> 
{  
    constructor(protected _http: Http) {} 

    add(entity: T) {} 
    delete(entity: T) {} 
    list() {} 
    get(id: number) {} 
    update(entity: T) {} 
} 

私のサービスクラスはその後、私の一般的なリポジトリクラスを拡張します。

export class Service extends Repository<Entity> 
{  
    constructor(protected _http: Http) { 
    super(Http); 
    } 
} 

私は親クラスの依存性注入を使用する際に問題が発生します。それを子クラスにどのように変換するのですか?

活字体は、私は次のエラーを取得するコンパイル:

error TS2345: Argument of type 'typeof Http' is not assignable to parameter of type 'Http'.Property '_backend' is missing in type 'typeof Http'

イムないこのエラーを修正する方法を確認してください。どんな助けでも大歓迎です。

答えて

7

(あなたが行ったように代わりのタイプの)あなたがちょうどあなたが渡されるインスタンスを転送する必要があります。

export class Service extends Repository<Entity> 
{  
    constructor(protected _http: Http) { 
    super(_http); 
    } 
} 

追加のパラメータは、サブクラスで導入されていない場合も追加のコードがで実行する必要はありませんサブクラスのコンストラクタは、コンストラクタを省略することができます。

+0

ありがとうございます。私は少しフォローアップの質問をお願いします。子クラスは、親クラスがインポートするクラスを継承しますか?例えば。親クラスは、http、応答、およびヘッダーをインポートします。それを親クラスにインポートする必要がありますか、できません。なぜなら、httpをインポートするときにエラーが発生するからです。エラーTS2304:名前 'Http'が見つかりません。私は依存関係を渡さなければならないか、それともすべてのクラスrxjs、レスポンス、ヘッダーなどが必要なのでしょうか? – Dblock247

+0

サブクラスが別のファイルにある場合は、コード内で参照するすべてのクラスまたは他の識別子をインポートする必要があります。あなたの '* .ts'ファイル(' X'は別のファイルで宣言されているクラスの名前です)のどこかで 'X'を使うと、そのクラスをインポートしてファイル内で知ることができます。説明するのはあまり簡単ではありません。これで明らかにならない場合は、後続の質問を残しておいてください;-) –

+0

_httpをプライベートにする必要がある場合は、子のコンストラクタがパラメータを取らないように親のプライベートなメンバーですか? – Shawn