我想做类似于"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";
});
(这违背了延迟加载的目的)。
这是为什么?我错过了什么吗?
任何帮助表示感谢。
答案 0 :(得分:1)
您似乎认为“声明空间”具有它没有的属性。有许多声明空间(有关更多信息,请参阅TypeScript语言规范1.8 Section 2.3 Declarations),它们用于确保标识符得到适当解析。
让我们来看看你引用的链接。
在延迟加载的链接中,我只注意它处理明确的require('foo')
语法,并且它出现的位置将影响需求和后续加载的时间。
在可选模块加载的链接中,我注意到以下内容。
如果模块标识符仅用作类型注释的一部分 并且从不作为表达,然后没有为此发出必需的调用 模块。
您的代码显然没有使用Module2作为类型注释,因此它将是必需的。