2017-02-07 5 views
1

Я относительно новичок в TypeScript. У меня есть необходимость в реализации двух маршрутных охранников, которые имеют общую функцию и состояние.DRYing up Angular2 TypeScript Class

Когда я пытаюсь расширить класс для инъекций с помощью конструктора, результирующий класс не получит экземпляры частных членов.

надуманный пример:

// guard-base.ts 

@Injectable() 
export abstract class GuardBase { 
    constructor(
    private sharedState: SharedState, 
) {} 

    sharedMethod(): boolean {. . .} 
} 


// authentication-required.guard.ts 

@Injectable() 
export class RouteGuard extends GuardBase implements CanActivate { 
    canActivate(): Promise<boolean> { 
    console.log(this); 
    // this.sharedState equals undefined at this point 
    } 
} 

Должен ли я предоставить аргументы конструктора в RouteGuard классе? Я хотел бы сделать инкапсуляцию всех импортов и общего метода в базовый класс. Это возможно? Если нет, то каков наилучший способ выполнить то, что я хотел бы сделать?

ответ

1

Даже другие языки ожидают, что вы предоставите новый конструктор для нового класса (в комплекте с параметрами), затем передайте эти параметры в конструктор родительского класса, чтобы делать то, о чем вы просите. http://www.c-sharpcorner.com/UploadFile/5089e0/how-to-use-super-keyword-in-typescript/

Используйте super(sharedState), чтобы передать параметр sharedState из дочернего элемента в конструктор родителя.

Если вы хотите получить доступ к переменной-члену из родительского класса, используйте protected вместо private.

+0

Gotcha. Хм. Я надеялся на что-то более элегантное. Будет ли у меня такая же проблема при расширении не-абстрактного класса? – Brandon

+0

@ Брэндон - да, это то же самое для всех классов, абстрактных или конкретных. – ps2goat

+0

Благодарим вас за помощь. Это не совсем так сухо, как питон, который я писал, но он будет работать :) – Brandon