【问题标题】:Export imported modules using Typescript AMD使用 Typescript AMD 导出导入的模块
【发布时间】:2014-01-26 10:56:27
【问题描述】:

假设我已经将这两个有趣的 Typescript 库实现为 AMD 模块。

MathBasics.ts

module MathBasics {
    export function add(a: number, b: number) {
        return a + b;
    }
    export function substract(a: number, b: number) {
        return a - b;
    }
}
export = MathBasics

MathAdvanced.ts

module MathAdvanced {
    export function mult(a: number, b: number) {
        return a * b;
    }
    export function div(a: number, b: number) {
        return a / b;
    }
}
export = MathAdvanced

如何将它们组合到一个 MathAll.ts 库中,这样客户端代码就不必同时引用它们。

MathAll.ts

import MathBasics = require("MathBasics");
import MathAdvanced = require("MathAdvanced"); 

module MathAll {
    export var MathBasics: MathBasics;  
    export var MathAdvanced : MathAdvanced;
    //Error: Type reference cannot refer to container 

    export module MathBasics;
    export module MathAdvanced;
    //Error: '{' expected

    export MathBasics;
    export MathAdvanced;
    //Error: Unexpected token; 'module, class, interface, enum, import or statement' expected.

}

export = MathAll;

我现在不在乎是否有 1 个或 3 个请求被提出。我的问题更多是关于开发便利性而不是性能。

【问题讨论】:

  • import MathAll = require('MathAll'); var MathBasics = MathAll.MathBasics;import MathBasics = require('MathBasics'); 更方便的是什么?
  • 如果不是两个模块而是像 10 个密切相关的模块,在一种情况下您有自动完成功能,而在另一种情况下您需要知道每个模块的名称。
  • 模块的一个想法是阻止你做你想做的事情。因此,这根本不是一个好主意。一个模块应该是封闭的和独立的,作为一个“单元”。您的 MathAll 根本不是一个模块,因为它可以“添加”到。可变模块有点破坏了使用模块的所有好处,你也介意开始编写非 AMD JS 代码。
  • 这里有更多有用的变化:stackoverflow.com/questions/30712638/…

标签: requirejs typescript amd


【解决方案1】:

您只需将以下两行添加到您的 MathAll.ts 文件中:

export import MathBasics = require("MathBasics");
export import MathAdvanced = require("MathAdvanced"); 

这将允许您使用 MathAll psudeo-module 基本上导入两者...

import math = require('./MathAll');

math.MathAdvanced....

但它可能会对您的自动完成造成严重破坏,并且有一些提示表明将来可能不允许这样做,这会破坏您的程序 - 所以要小心使用这个技巧。

所以现在我已经展示了你如何可以做到这一点,希望你会接受我的建议,不要这样做(因为你知道我不是说“不要这样做" 只是因为我不知道如何你能做到)。

以一种让每个模块都可以自行导入的方式来组织您的模块。需要的时候导入MathBasics,需要的时候导入MathAdvanced,是不是这么难?

如果您隐藏了实现细节,那是另一回事 - 但当您export import 时,您肯定没有隐藏实现细节 - 因为您通过直接导出所有细节来炫耀它们。

【讨论】:

  • 嘿,这确实有效并生成了正确的 MathAll.js,但自动完成确实不起作用,所以我将重新考虑我的设计更加独立,而不是那么分层。谢谢!
  • 我认为我的困惑的根源在于将模块过多地视为命名空间,而一旦使用 require.js,它们就应该被视为程序集。
  • 有点——你仍然可以使用文件夹结构来组织它们,就像命名空间一样,即./Travel/Railways/Train.ts
猜你喜欢
  • 1970-01-01
  • 2015-05-08
  • 2017-04-24
  • 1970-01-01
  • 2012-11-06
  • 2012-10-12
  • 2015-07-19
  • 1970-01-01
相关资源
最近更新 更多