参考.ts文件仅用于类型检查

时间:2013-05-09 18:21:37

标签: typescript

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

我的样本:

Test1.ts:

export class Test1 {

}

Test2.ts:

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

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

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

2 个答案:

答案 0 :(得分:4)

不使用模块加载器

只有在使用某种模块模式(AMD / CommonJS)时,文件根级别的export关键字才有意义。如果你不是以下将工作:

Test1.ts:

class Test1 { // Do not use export

}

Test2.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;

错误,因为 exports 未在任何地方定义。

如果 使用AMD(或CommonJS)

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

Test1.ts:

export class Test1 {

}

Test2.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.class,其中importedFile将是我选择在导入时调用文件的内容(我在给定示例中将其称为mod)< / p>

答案 1 :(得分:1)

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

实施例: 的 Test1.ts

module SomeModule {
    export class Test1 {
    }
}

<强> Test2.ts

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

您可以选择将Test2添加到同一个“命名空间”,然后引用Test1而不指定模块名称:

module SomeModule {
    export class Test2 {
        abc: Test1;
    }
}