Я нашел странную ошибку.Перекрестные ссылки с расширенными классами в TypeScipt
Если у вас есть два класса в разных файлах, и, например, класс B расширяет класс и класс имеет переменный напечатал B, машинопись компилирует в неправильном порядке с --out основными. js command (при компиляции всего проекта в один файл). результаты Wrond порядка, что Javascript выдает ошибку: Uncaught TypeError: Не удается прочитать свойство «прототип» неопределенной Это происходит потому, что класс B раньше в коде, чем , и он хочет, чтобы его использовать.
Вот самый простой пример:
A.ts
///<reference path='B.ts'/>
class A
{
public b: B;
constructor()
{
}
init()
{
this.b=new B();
}
}
B.ts
///<reference path='A.ts'/>
class B extends A
{
constructor()
{
super();
}
}
app.ts
///<reference path='A.ts'/>
var a: A=new A();
a.init();
Сформированные main.js
var __extends = this.__extends || function (d, b) {
function __() { this.constructor = d; }
__.prototype = b.prototype;
d.prototype = new __();
};
var B = (function (_super) {
__extends(B, _super);
function B() {
_super.call(this);
}
return B;
})(A);
var A = (function() {
function A() {
}
A.prototype.init = function() {
this.b = new B();
};
return A;
})();
var a = new A();
a.init();
//@ sourceMappingURL=main.js.map
Вы когда-либо испытывали эту проблему? Если у кого-то есть обходное решение, пожалуйста, помогите мне!
Спасибо!
Это может сработать, но A должен действительно знать о классе B, потому что в моем реальном коде он будет использовать специальные свойства, поэтому я не могу использовать этот метод. В javascript, если изменить порядок вручную после компиляции, он работает как шарм. – Grosmar
Я нашел два обходных пути к этой проблеме, но ни один из них не слишком хорош: пользовательский интерфейс вместо точного класса, или вы можете использовать тип ** любой **, но это не так хорошо .... – Grosmar
Действительно, вам нужно убить проблему зависимости. Либо A не может зависеть от B, либо наоборот. Возможно, вам нужно уйти от наследования и вместо этого использовать делегацию. – Fenton