2

语境

我们将当前项目(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. 这意味着我不能使用接口来键入所需的模块。

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

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

4

2 回答 2

2

恐怕没有办法让编译器不在定义调用中生成附加要求。

使用 vanilla require 语句时,您可以尝试使用 --declaration 编译器标志从 ts 文件为您生成一个 .d.ts(这样您就不需要添加该存根)。希望这可以帮助。

听起来也像是编译器中的一个很好的功能(我想是一个简单的实现),所以你可能想在这里请求:https ://typescript.codeplex.com/workitem/list/basic (发送链接在评论中,我一定会投赞成票)。

于 2013-04-23T23:59:35.627 回答
0

错误的答案。留给上下文。

您要解决的问题:我想确保小部件可以引用我的核心模块,但不会将它们包含在它们的输出文件中。

当你这样做:

import baseClass = module("core/SomeBaseClass");

并使用--module 'amd'它创建的编译器标志进行编译,definerequire调用与您尝试实现的相同。它不会把它拉进去。你可以看到我在这里创建的一个示例:https ://github.com/basarat/TypeScriptEditor/tree/gh-pages/scripts

于 2013-04-23T13:46:39.293 回答