2013-04-23 81 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

相關問題