语境
我们将当前项目(TypeScript + RequireJS)拆分为单独的模块(core、widget1、...)。我们正在运行 TypeScript 0.8.1.1 版。
每个模块都构建为单个文件,并且最初将加载核心。小部件将被延迟加载,仅在需要它们的情况下,但我想确保小部件可以引用我的核心模块(但不包括在其输出中的模块)。
为了澄清将 TypeScript 编译为 AMD 模块时,import
语句将被编译到模块define
函数的依赖数组中。例子:
打字稿
import coreModule = module("core");
JavaScript 输出(带有 AMD 标志)
define(['require', 'exports', 'core'], function(require, exports, __CoreModule__){
var coreModule = __CoreModule__;
});
这正是我想要避免的。
因此,我计划用一个替换所有import someCoreModule = module("core/...");
语句var someCoreModule = require("core/...");
。
问题
我面临的问题是其中一些核心模块正在返回可以由小部件扩展的基类。由于 TypeScript 中的命名空间,这意味着我需要将它们扩展如下:
import baseClass = module("core/SomeBaseClass");
class Child extends baseClass.Base {
}
当然,当用一个语句替换import
语句时,我仍然需要相同的语法require
:
var baseClass = require("core/SomeBaseClass");
class Child extends baseClass.Base {
}
这显然会导致关于缺少类型(Base)的错误。我目前计划通过提供基类的存根实现来规避这个错误。如下:
declare module baseClass {
class Base {
}
}
var baseClass = require("core/SomeBaseClass");
class Child extends baseClass.Base {
}
虽然这可行,但我觉得这看起来相当难看。我需要能够扩展类,因为我需要调用super
. 这意味着我不能使用接口来键入所需的模块。
有谁知道更好的解决方案,还是我被迫以这种方式解决我的问题?
与往常一样,非常感谢任何帮助!