我们将当前项目(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
。这意味着我无法使用界面来键入 required 模块。
有没有人知道更好的解决方案,还是我被迫以这种方式解决我的问题?
与往常一样,任何帮助都非常感谢!
答案 0 :(得分:2)
我担心没有办法让编译器在define调用中不生成额外的要求。
使用vanilla require语句时,您可以尝试使用--declaration编译器标志从ts文件生成.d.ts(以便您不需要添加该存根)。希望这可以帮助。
这听起来像编译器中的一个很好的功能(我想要实现一个简单的功能),所以你可能想在这里请求:https://typescript.codeplex.com/workitem/list/basic(在评论中发送链接,我会绝对投票给它)。
答案 1 :(得分:0)
错误答案。留待上下文。
您要解决的问题:我想确保小部件可以引用我的核心模块,但不会在输出文件中包含这些模块。
当你这样做时:
import baseClass = module("core/SomeBaseClass");
并使用--module 'amd'
编译器标志进行编译,它会创建与您尝试实现的define
和require
调用相同的调用。它不会将其拉入。您可以在此处看到我创建的示例:https://github.com/basarat/TypeScriptEditor/tree/gh-pages/scripts