我不知道是否有可能将“导出模块”分布在多个文件中。
如果我有文件 Contact.ts:
// file Contact.ts
export module Contacts {
export class Contact {
...
}
}
和另一个 ContactView.ts
// file ContactView.ts
export module Contacts {
export class ContactView {
model: Contact; // <--- is not recognized
}
}
然后 TSC 无法识别 Contact 类。如您所见,Contact 和 ContactView 被声明为驻留在同一模块中,并且根据规范它应该可以工作。
我正在构建一个使用 require.js 和 AMD 模式的复合应用程序,因此我必须使用“导出模块”声明。
我应该做某种类型的“提前声明”还是一些棘手的“导入”?
感谢您的建议。
编辑:目前我通过导入分别加载每个模块,但是,如果您注意到的话,它会造成巨大的代码浪费和大量“导入”依赖项。 我的问题是是否有一种方法可以使用相同的命名空间(即联系人)来让我知道我不想导入的 TS。 我正在查看正常的//命令,但它不起作用。到目前为止,我什至尝试了 *.d.ts 声明文件但没有成功。
最佳答案
该规范允许您跨多个文件定义内部模块(本质上,内部模块指的是 javascript 模块模式)。 外部 模块,例如 AMD 或 CommonJS 模块,其工作理念是每个文件都是实际的“代码模块”,并且其中的命名空间/命名是无关紧要的,因为模块将被加载到其无论如何拥有新对象。
您可以编写以下代码来加载 ContactView.ts 模块中的 Contact.ts 模块:
// file ContactView.ts
import mod = module("./Contact");
export module Contacts {
export class ContactView {
model: mod.Contacts.Contact; // <--- will be recognized
}
}
这应该可以很好地工作,但是如果您想在另一个区域访问这两个模块的内容(例如,自己制作一个新的联系人模型),您实际上必须导入这两个模块:
import c = module("./Contact");
import cv = module("./ContactView");
我认为这很好,因为您清楚地说明了您的依赖关系。缺点是它们不会共享一个共同的父对象,因此让它们都处于“联系”模块模式可能没有多大用处。
另一种选择是将“Contact”与“ContactView”一起导出,如下所示(假设此代码有点愚蠢,因为您已经通过 ContactView 的模型属性完全做到了这一点,但绝不会少...) :
export module Contacts {
export class ContactView {
model: mod.Contacts.Contact;
constructor() {
this.model = new mod.Contacts.Contact();
}
}
export var Contact = mod.Contacts.Contact;
}
因此您可以在加载 ContactView 后访问它。
编辑:顺便说一下,您不仅限于通过“export module Name { ... }”导出模块,您可以导出任何内容,因为文件本身就是模块。因此,您可以拥有一个只有“export function foo() { ... }”而没有任何模块模式代码包装它的文件。
EDIT2:看起来 AMD 可能具有加载多个依赖项并从中构建“模块”的功能,但我不知道这在 TS 中如何工作,这里有一个链接:http://www.adobe.com/devnet/html5/articles/javascript-architecture-requirejs-dependency-management.html (构造函数模块)。
关于typescript - 如何跨多个 AMD 文件传播模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790262/