2016-10-29 2 views
2

Вопреки всему, что я читал, мне кажется не удается расширить класс, где базовому классу требуется вводимая ссылка OpaqueToken.Невозможно расширить суперкласс при использовании @Inject с угловым 2

Пример:

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

В этом примере App_Const происходит от OpaqueToken, который предусмотрен в модуле, как например:

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

Я знаю, что по какой-то причине вам нужно позвонить @ Inject, изменив таким образом первый пример:

@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 является непрозрачным, а не определенным типом? Несмотря на документы, я очень смущен, потому что это похоже на какой-то вкус, который должен работать прямо из коробки.

tldr: Я хочу расширить класс, для которого требуется введенный элемент, который является производным от OpaqueToken, однако для этого мне нужно использовать @Inject для производного класса, который по какой-либо причине разбивает родительский класс ,

Любая помощь приветствуется. Благодарю.

+0

Вы пробовали использовать другое имя параметра в 'Hero_Cmp'? как конструктор (@Inject (App_Const) protected appConstants) {super (appConstants); } ' – yurzui

ответ

2

Я бы сказал, что проблема не связана с угловым или IoC. Это просто проверка машинопись компилятор (observe it here):

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

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

произведет ошибку:

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

потому, что родитель имеет свойство private, в то время как ребенок protected. Это не имеет смысла.

просто сделать его защитой, а также

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

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

Да, это было частью этого. Я переключил их обоих на защищенные, но все же получил ошибки. Тем не менее, ошибки были связаны с макроблоками, зависящими от порядка загрузки, что было не так сложно исправить. Спасибо! – dudewad

Смежные вопросы