3

我想在 .ts 文件中引用另一个 .ts 文件。在我的真实项目中,我只需要它来保证类型安全(覆盖继承的成员以进行正确编译)。

我的样本:

测试1.ts:

export class Test1 {

}

测试2.ts:

/// <reference path="Test1.ts" />
export class Test2 {
    abc: Test1; // ERROR: Test1 could not be found
}

这不可能吗?我想避免导入,因为它是我在输出的 JavaScript 文件中不需要的开销。

更新:我使用 Test1 作为 amd 模块,其类 Test1 被底层框架实例化并注入到类 Test2 的实例中。这就是为什么我需要 export 关键字但不想直接导入模块 Type1 - 我只需要引用该类以避免编译器错误并具有类型安全等。

4

2 回答 2

4

不使用模块加载器

仅当您使用某些模块模式(AMD / CommonJS)时,文件根级别的 export 关键字才相关。如果你不是以下将工作:

测试1.ts:

class Test1 { // Do not use export

}

测试2.ts:

/// <reference path="Test1.ts" />
class Test2 {
    abc: Test1; // No Error
}

但是,如果您这样做,您有责任确保在 Test2.js 之前加载 Test1.js,可能使用脚本标记。

注意:如果您使用根级别导出而不使用模块加载器,例如:

export class Test2 {
}

生成的javascript:

var Test2 = (function () {
    function Test2() { }
    return Test2;
})();
exports.Test2 = Test2;

错误的,因为没有在任何地方定义导出。

如果您使用的是AMD(或 CommonJS)

然后你需要使用一个导入来告诉加载器加载文件:

测试1.ts:

export class Test1 {

}

测试2.ts:

// no reference to other ts required.     
import mod = module("Test1"); // Instead you need to load the module

export class Test2 {
    abc: mod.Test1; // Reference by module 
} 

此外

在 AMD 领域,每个文件都是一个模块。所以我不想在文件中包含模块,因为这是另一个级别的重定向。即我将需要做importedFile.module.class而不是我选择在导入时调用文件的位置(我在给定的示例中调用它)importedFile.classimportedFilemod

于 2013-05-09T21:43:02.820 回答
1

您必须在模块中添加该类,以便外部世界可以通过其模块引用它。

示例: Test1.ts

module SomeModule {
    export class Test1 {
    }
}

测试2.ts

/// <reference path="Test1.ts" />
export class Test2 {
    abc: SomeModule.Test1;
}

或者,您可以将 Test2 添加到相同的“命名空间”,然后在不指定模块名称的情况下引用 Test1:

module SomeModule {
    export class Test2 {
        abc: Test1;
    }
}
于 2013-05-09T20:53:41.023 回答