typescript - 如何跨多个 AMD 文件传播模块?

标签 typescript

我不知道是否有可能将“导出模块”分布在多个文件中。

如果我有文件 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/

相关文章:

typescript - tsconfig.json 在 yarn 启动 React 应用程序后被重置

reactjs - 类型 'name' 上不存在属性 'EventTarget' - React + TypeScript

javascript - 类型错误 : Type 'string' is not assignable to type 'Colors'

javascript - TypeScript 中的正则表达式

angular - 具有提前 (AOT) 编译的 Webpack、Typescript 和 Angular2?

typescript - TypeScript 中每个键通用的映射对象类型

Angular2 从坐标数组生成 KML 文件

typescript - 为什么不能在属性方法中访问静态成员,而在原型(prototype)方法中可以访问?

typescript - Angular2 返回一个已经解决的 promise

javascript - Cytoscape.js 警告 : "The style value of ` label` is deprecated for `width` "when trying to have a node with same width of label