3

我发现了一个奇怪的错误。

如果您在不同的文件中有两个类,例如 class B扩展了 class A,并且 class A有一个类型为B的变量,TypeScript 会使用 --out main.js 命令以错误的顺序编译(当您将整个项目编译到一个文件中时) . 错误的顺序导致 javascript 抛出错误:Uncaught TypeError: Cannot read property 'prototype' of undefined 这是因为代码中的类BA早,它想使用它。

这是最简单的例子:

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();
    }
}

应用程序.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

有解决方法吗?

4

2 回答 2

1

我不确定你的循环依赖。如果你想替换类,那么依赖关系真的应该是一个方向。这是一个例子:

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,所以您可以在创建新 A 时传入 B 的实例。因为依赖是单向的,所以 TypeScript 现在有机会以正确的顺序编译事物。

这是显示依赖问题的图片:在此处输入图片描述

于 2013-01-04T12:04:20.267 回答
0

使用export声明的打字稿模块或类或接口上的语句,然后您可以import使用所需的函数、类或其他任何东西。Typescript 引发错误,因为您尝试引用的变量不存在。

例如:

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();
于 2013-01-04T12:05:38.050 回答