2016-10-29 10 views
2

私が読んだのとは反対に、基本クラスに注入されたOpaqueToken参照が必要なクラスを拡張できないようです。@InjectをAngular 2で使用するとスーパークラスを拡張できません

例:この例では

@Component({}) 
export class StructureBase_Cmp { 
    constructor(private constants:App_Const){ 
    } 
} 

App_Constは、次のようなモジュールで提供されてOpaqueTokenから来ている:

providers: [ 
    {provide: App_Const, useValue: Constants} 
], 

私が何らかの理由であなたが呼び出す必要があることを承知しています@注入すると、最初の例が次のように変更されます。

@Component({}) 
export class StructureBase_Cmp { 
    constructor(@Inject(App_Const) private constants){ 
    } 
} 

良い。

@Component({}) 
export class Hero_Cmp extends StructureBase_Cmp{ 
    constructor(@Inject(App_Const) protected constants) { 
     super(constants); 
    } 
} 

しかし、私はこれに、スーパークラスを変更することはできません:

それは派生クラスで異なるタイプのものであり、「プライベート定数」と文句を言いますので、どのような正常に動作しないと、そのクラスを拡張しようとしています
@Component({}) 
export class StructureBase_Cmp { 
    constructor(private constants:App_Const){ 
    } 
} 

なぜなら、App_ConstはOpaqueTokenであり、定義されたタイプではありませんか?ドキュメントにもかかわらず、私は非常に混乱しています。これは、これがいくつかの味が箱の中ですぐに機能するように感じるからです。

tldr: OpaqueTokenから派生した注入されたアイテムを必要とするクラスを拡張したいが、そのためには、派生クラスで@Injectを使用する必要がある。何らかの理由で親クラスを壊す。

何か助けていただければ幸いです。ありがとう。

+0

あなたはHero_Cmp' 'で他のパラメータ名を使用しようとしたことがありますか?コンストラクタ(@Inject(App_Const)protected appConstants){super(appConstants);} } ' – yurzui

答えて

2

私はこの問題は角度もIoCも関係ないと言います。それはちょうどtypescriptですコンパイラチェック(observe it here)である:子protectedながら親は、プロパティprivateを持っているので、

Class 'Hero_Cmp' incorrectly extends base class 'StructureBase_Cmp'.
Property 'constants' is private in type 'StructureBase_Cmp' but not in type 'Hero_Cmp'. class Hero_Cmp

export class StructureBase_Cmp { 
    constructor(private constants){ 
    } 
} 

export class Hero_Cmp extends StructureBase_Cmp{ 
    constructor(protected constants) { 
     super(constants); 
    } 
} 

はエラーを生成します。それは意味をなさない。

ちょうどそれは同様に保護されたことを確認してください

export class StructureBase_Cmp { 
    constructor(protected constants){ // also protected 
    } 
} 

export class Hero_Cmp extends StructureBase_Cmp{ 
    constructor(protected constants) { 
     super(constants); 
    } 
} 
+1

はい、これはその一部でした。私はそれらを保護されたものに切り替えましたが、まだエラーがあります。しかし、これらのエラーは、ロード順序を修正するにはそれほど厳しいものではないTypescriptsの細かいことに関連していました。 ありがとう! – dudewad

関連する問題