2013-01-04 7 views
3

Я нашел странную ошибку.Перекрестные ссылки с расширенными классами в 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 

Вы когда-либо испытывали эту проблему? Если у кого-то есть обходное решение, пожалуйста, помогите мне!

Спасибо!

ответ

0

Я не уверен в ваших круговых зависимостях. Если вы хотите заменить классы, то зависимости действительно должны быть в одном направлении. Вот пример:

class A { 
    constructor(public b: A) 
    { 
    } 
} 

class B extends A 
{ 
    constructor() 
    { 
     super(this); 
    } 
} 

var a = new A(new B()); 
var b = new B(); 

Теперь Ваш файл «b.ts» нужно только в зависимости от файла «a.ts» - не наоборот. Поскольку B расширяет A, вы можете передать экземпляр B при создании нового A. Поскольку зависимость является однонаправленной, у TypeScript теперь есть возможность собрать вещи в правильном порядке.

Here is a picture to show the dependency issue:enter image description here

+1

Это может сработать, но A должен действительно знать о классе B, потому что в моем реальном коде он будет использовать специальные свойства, поэтому я не могу использовать этот метод. В javascript, если изменить порядок вручную после компиляции, он работает как шарм. – Grosmar

+0

Я нашел два обходных пути к этой проблеме, но ни один из них не слишком хорош: пользовательский интерфейс вместо точного класса, или вы можете использовать тип ** любой **, но это не так хорошо .... – Grosmar

+1

Действительно, вам нужно убить проблему зависимости. Либо A не может зависеть от B, либо наоборот. Возможно, вам нужно уйти от наследования и вместо этого использовать делегацию. – Fenton

0

Используйте export заявление по заявленному модуля машинопись или класса или интерфейса, то вы можете import нужную функцию, класс или любой другой. Typcript выдает ошибку, потому что переменная, которую вы пытаетесь установить, не существует.

Например:

module API { 
    export class Main { 
     public name: string; 
     public interest: string; 

     constructor() { 
      this.name = "Someone"; 
      this.interest = "web technology"; 
     } 

     puts() { 
      console.log(this.name, " like", this.interest); 
     } 
    } 
} 

..и тогда вы можете вызвать нужную функцию.

import API; 
var c = new API.Main(); 
+0

Для этого вопроса классы не завернуты во внутренний модуль, поэтому ключевое слово 'export' не требуется. – Fenton

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