TypeScript:扩展已通过require加载的类

时间:2013-04-23 13:38:41

标签: requirejs typescript amd

上下文

我们将当前项目(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 模块。

有没有人知道更好的解决方案,还是我被迫以这种方式解决我的问题?

与往常一样,任何帮助都非常感谢!

2 个答案:

答案 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'编译器标志进行编译,它会创建与您尝试实现的definerequire调用相同的调用。它不会将其拉入。您可以在此处看到我创建的示例:https://github.com/basarat/TypeScriptEditor/tree/gh-pages/scripts