Я использую инъекцию зависимостей для всех моих дочерних классов, которые расширяют абстрактный класс.
Проблема, заключающаяся в том, что в классе abstract constructor я запускаю метод, который я планировал переопределить в своих дочерних элементах, если это необходимо.
Я застрял в проблеме, что моя вложенная зависимость не отображается в моем классе переопределения, который запускается из супер.
Вот пример кода:
abstract class Base {
    constructor(view: string) {
        this._assemble();
    }
    protected _assemble(): void {
        console.log("abstract assembling for all base classes");
    }
}
class Example extends Base {
    constructor(view: string, private helper: Function) {
        super(view);
        console.log(this.helper);
    }
    public tryMe(): void {
        this._assemble();
    }
    protected _assemble(): void {
        super._assemble();
        // at first run this.helper will be undefined!
        console.log("example assembling", this.helper);
    }
}
let e = new Example("hoho", function () { return; })
console.log("So now i will try to reassemble...");
e.tryMe();
Итак, ядро проблемы состоит в том, что typescript преобразует класс Example в код следующим образом:
function Example(view, helper) {
    _super.call(this, view);
    this.helper = helper;
    console.log(this.helper);
}
Вместо этого:
function Example(view, helper) {
    this.helper = helper;
    _super.call(this, view);
    console.log(this.helper);
}
Как вы видите, если я помещаю this.helper до _super в JavaScript, this.helper будет всегда отображаться в _assemble. Даже если super вызовет функцию _assemble.
Но по умолчанию это назначается после вызова _super. Поэтому, если класс super вызовет сборку. Он не будет отображаться при переопределении метода _assemble в примере в первый раз.
Итак, мой вопрос...
Это ошибка?
или
Что я не знаю?
Теперь я исправил свою проблему, просто удалив _assemble из класса super и всегда вызываю ее из дочернего. Но это просто неправильно.
Nota Bene: Вот скомпилированный код JavaScript и демонстрационный код JavaScript:
TypeScript обычный вывод:
var __extends = (this && this.__extends) || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var Base = (function () {
    function Base(view) {
        this._assemble();
    }
    Base.prototype._assemble = function () {
        document.write("<p>abstract assembling for all base classes</p>");
    };
    return Base;
}());
var Example = (function (_super) {
    __extends(Example, _super);
    function Example(view, helper) {
        _super.call(this, view);
        this.helper = helper;
        console.log(this.helper);
    }
    Example.prototype.tryMe = function () {
        this._assemble();
    };
    Example.prototype._assemble = function () {
        _super.prototype._assemble.call(this);
        // at first run this.helper will be undefined!
        document.write("<p>example assembling <b/>" + (this.helper) + "</b></p>");
    };
    return Example;
}(Base));
var e = new Example("test", function () { return "needle"; });
document.write("<p><i>So now i will try to reassemble...</i></p>");
e.tryMe();