TypeScript模块(仅由类型引用)仍然是运行时依赖项

时间:2016-03-24 17:45:57

标签: typescript

我想做类似于"Optional Module Loading and Other Advanced Loading Scenarios"中描述的内容,但它不起作用。

考虑这两个文件:

module1.ts

// declare function require(moduleNames: string[], onLoad: (...args: any[]) => void): void;
/// <reference path="./require.d.ts"/>

import { Module2 as M2 } from "./module2";

var needsLazyLoading:boolean = false;

if (needsLazyLoading) {
    require(["./module2"], (Module2: typeof M2) => {
        let module2 = new Module2();
        if (module2.someMethod("...")) { /* ... */ }
    });
}

module2.ts

export class Module2 {
  public someMethod(s:string):boolean{ return true; } /* ... */
 }

现在,我像这样编译module1.ts

tsc --module amd --outFile moduleFull1.js module1.ts

根据我上面引用的文章,我不希望moduleFull1.js引用Module2"Use case: Lazy loading"中也会提到相同的内容)。

然而,它就在那里......

moduleFull1.js

define("module2", ["require", "exports"], function (require, exports) {
    "use strict";
    var Module2 = (function () {
        function Module2() {
        }
        return Module2;
    }());
    exports.Module2 = Module2;
});
define("module1", ["require", "exports"], function (require, exports) {
    "use strict";
});

(这违背了延迟加载的目的)。

这是为什么?我错过了什么吗?

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

您似乎认为“声明空间”具有它没有的属性。有许多声明空间(有关更多信息,请参阅TypeScript语言规范1.8 Section 2.3 Declarations),它们用于确保标识符得到适当解析。

让我们来看看你引用的链接。

在延迟加载的链接中,我只注意它处理明确的require('foo')语法,并且它出现的位置将影响需求和后续加载的时间。

在可选模块加载的链接中,我注意到以下内容。

  

如果模块标识符仅用作类型注释的一部分   并且从不作为表达,然后没有为此发出必需的调用   模块。

您的代码显然没有使用Module2作为类型注释,因此它将是必需的。