Typescript中的依赖项解析

Typescript中的依赖项解析,typescript,Typescript,我有一个大型的Typescript项目,它连接到一个JS文件中进行部署。 确保文件以正确的顺序连接的正确方法是什么?文件太多,无法手动维护 如果文件a中的一个类依赖于文件B中的一个类,则结果连接文件中的类的顺序很重要。如果文件B出现的时间晚于文件A,则在运行时无法解析该类 这肯定是一个普遍的问题,应该有一个简单的解决办法。 一个警告是我使用名称空间而不是模块。我不确定在整个项目中使用模块是否能解决这个问题 下面是一个简单的例子 TestClassA.ts namespace Test {

我有一个大型的Typescript项目,它连接到一个JS文件中进行部署。 确保文件以正确的顺序连接的正确方法是什么?文件太多,无法手动维护

如果文件a中的一个类依赖于文件B中的一个类,则结果连接文件中的类的顺序很重要。如果文件B出现的时间晚于文件A,则在运行时无法解析该类

这肯定是一个普遍的问题,应该有一个简单的解决办法。 一个警告是我使用名称空间而不是模块。我不确定在整个项目中使用模块是否能解决这个问题

下面是一个简单的例子 TestClassA.ts

namespace Test {
    'use strict';

    import TestClassB = Test.TestClassB;

    export class TestClassA {
        private test: TestClassB;
        constructor() {
            this.test = new TestClassB();
        }
    }
}
namespace Test {
    'use strict';

    export class TestClassB {

        private value: string;

        constructor() {
            this.value = 'test';
        }
    }
}
'use strict';

describe('test', (): void => {
    it ('should create an object', (): void => {
        let a: Test.TestClassA = new Test.TestClassA();

        expect(a).toBeDefined();
    });
});
TestClassB.ts

namespace Test {
    'use strict';

    import TestClassB = Test.TestClassB;

    export class TestClassA {
        private test: TestClassB;
        constructor() {
            this.test = new TestClassB();
        }
    }
}
namespace Test {
    'use strict';

    export class TestClassB {

        private value: string;

        constructor() {
            this.value = 'test';
        }
    }
}
'use strict';

describe('test', (): void => {
    it ('should create an object', (): void => {
        let a: Test.TestClassA = new Test.TestClassA();

        expect(a).toBeDefined();
    });
});
TestClass.spec.ts

namespace Test {
    'use strict';

    import TestClassB = Test.TestClassB;

    export class TestClassA {
        private test: TestClassB;
        constructor() {
            this.test = new TestClassB();
        }
    }
}
namespace Test {
    'use strict';

    export class TestClassB {

        private value: string;

        constructor() {
            this.value = 'test';
        }
    }
}
'use strict';

describe('test', (): void => {
    it ('should create an object', (): void => {
        let a: Test.TestClassA = new Test.TestClassA();

        expect(a).toBeDefined();
    });
});
在Karma.config文件中,将文件指定为

files: [
      'src/**/*.js',
      'test/**/*.spec.js'
    ],
测试将失败,异常为TestClassB不是构造函数

如果相反,我将Karma.config文件指定为 文件:['src/TestClassB.ts','src/TestClassA.ts','test/***.spec.ts']

然后考试就通过了


但是对一个包含数百个文件的项目执行此操作将变得不可维护。

使用绑定器的ES6导入/导出

代码 配置 注意:请参见楼上的链接以了解此配置

命令 正如古希腊语一样,将代码分割成多个文件的首选方法是使用模块而不是名称空间。我一直站在你的立场上,名称空间确实更适合创建编译的连接输出,但是开发人员和大多数社区都忽略了它

对于非普通项目,您基本上被迫使用模块,对于这些模块,首选语法为:


这必须由ES6浏览器来处理,ES6浏览器是一个模块加载系统,因为我现在发现,如果在TestClassA中使用TestClassB时,我将TestClassB的名称完全量化为Test.TestClassB,那么一切都是好的,它可以正常工作。我本以为这就是import语句的别名所做的。如果您查看对该问题的其他编辑,您的答案是否仍然适用?“我不认为是这样。”莉莎·罗伯茨我不使用因果报应,我无法帮助你配置它。但是我添加了一个使用ES6导入/导出而不是
名称空间
的示例。我最终构建了一个类似于这样的工具,它可以搜索代码并创建源文件的输出文件,从而消除问题。那个些依赖性最小的文件列在第一位,等等。但是,Grunt可以导入这些文件进行连接,但很难为Wallaby或Karma工作。我找到了一个简单的解决方案。不要将导入语句用于别名。导致问题的是import语句。这将创建一个本地类型,该类型被设置为要使用别名的类型。如果顺序不正确,这是未定义的。@LIZARoberts,但是每次都必须键入完全限定名,对吗?在我看来,提取
import
别名可以提供一个不错的解决方案,只要它们的内容在某种程度上是标准化的。至少,它证明对我有用。