2013-04-23 39 views
2

上下文

我们将当前项目(TypeScript + RequireJS)拆分为单独的模块(核心,widget1,...)。我们正在运行TypeScript的0.8.1.1版本。TypeScript:扩展一个已经通过require加载的类

每个模块都构建为一个文件,并且核心将在最初加载。这些小部件将被延迟加载,只在需要的情况下,但我想确保这些小部件可以引用我的核心模块(但是而不是在其输出中包含该模块)。


要编译打字稿到AMD模块时澄清import语句会被编译成模块的功能define的依赖性阵列。例如:

打字稿

import coreModule = module("core"); 

的JavaScript输出(与AMD标志)

define(['require', 'exports', 'core'], function(require, exports, __CoreModule__){ 
    var coreModule = __CoreModule__; 
}); 

这正是我想避免的。

因此,我打算用var someCoreModule = require("core/...");替换所有import someCoreModule = module("core/...");陈述。

问题

我现在面临的问题是一些这些核心模块正在返回其可以通过微件被扩展的基类。由于打字稿的命名空间,这意味着我需要延长这些如下:

import baseClass = module("core/SomeBaseClass"); 
class Child extends baseClass.Base { 
} 

而且ofcourse我有require一个替换import语句时仍然需要此相同的语法:

var baseClass = require("core/SomeBaseClass"); 
class Child extends baseClass.Base { 
} 

这显然会导致关于缺少类型(基本)的错误。我目前计划通过提供基类的存根实现来规避这个错误。如下:

declare module baseClass { 
    class Base { 
    } 
} 

var baseClass = require("core/SomeBaseClass"); 
class Child extends baseClass.Base { 
} 

虽然这个工程,我觉得这相当丑陋的样子。我需要能够延长课程,因为我需要拨打super。这意味着我无法使用界面来键入所需的模块。

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

一如既往,任何帮助非常感谢!

回答

0

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

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

当你这样做:

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

,并用它创建一个definerequire通话,你正在努力实现一样--module 'amd'编译器标志编译。它不会拉入。您可以看到我在此创建的示例:https://github.com/basarat/TypeScriptEditor/tree/gh-pages/scripts

+0

在你的例子中,编译的'CompilationService.js'正在做我想避免的:)它编译定义调用的依赖数组中的'EditorPosition'的输入? – thomaux 2013-04-23 13:52:14

+0

我以为你试图避免///引入整个文件*的问题的引用风格。任何你不希望它在主要定义调用中的原因?延迟加载? – basarat 2013-04-23 13:58:14

+0

是的,我只想在需要的时候才加载文件:) – thomaux 2013-04-23 14:01:46

2

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

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

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

+0

有一种方法:)使用'require'而不是'import'。我将着眼于为这些类生成d.ts文件。感谢你的回答! – thomaux 2013-04-24 07:56:23

+0

我投票结束这个问题,因为我找到了正确的解决方案,就如何从我的核心中分离我的小部件(这是所有这些背后的想法)。我不确定这应该在TypeScript中工作(如我所描述的)。感谢您的意见:) – thomaux 2013-04-24 13:57:40

+0

@Anzeo你应该发布你的解决方案,并将其标记为答案。它是一个在stackoverflow上完成的完全有效的事情。您必须在发布答案后等待2天才能做到这一点。 – basarat 2013-04-24 14:18:53

相关问题