2014-01-13 17 views
4

我在打字稿中聲明循環依賴關係時遇到問題。這裏,S代碼:打字稿中的循環依賴關係

//Widget.module.ts

/// <reference path="Buttons.ts" /> 

export module Widget { 

    class Widget { 

    } 
} 

//Buttons.ts

/// <reference path="Widget.module.ts" /> 

class Button extends Widget{ 
    function x(){ 
    ... 
    } 

    ... 

} 

在這方面,安排我想有定義模塊的主文件然後從該主文件引用一些文件。這些文件可能包含一些調用,實例化或相互繼承的類。

目前我在包含源代碼Buttons.ts中的「extends Widget」的行上收到此錯誤 - 無論我是否包含在導出的模塊中。

Could not file symbol widget 

--Update--

我想使用的參考標記而不是進口/需要的原因是,我想用--out標誌這些獨立的打字稿文件編譯成一個單一的JavaScript文件在打字稿編譯器中。

回答

1

我假設你的兩個文件在同一個文件夾中?

從目前的代碼,我不明白你爲什麼想參考Widget.module.ts文件中的Button.ts,但那不是重點。

您不包括Widget.module文件,您只能引用它。引用TypeScript文件只能用於類型聲明,而不能用於實現。

你的代碼更改爲:

import Widget = require("Widget.module"); 

class Button extends Widget.Widget { 
    x() { 
    // ... 
    } 

    // ... 
} 

請注意,您需要引用類爲Widget.Widget,你導出的模塊,而不是類。另外,如果你正在構建一個web應用程序,你需要一個模塊加載器來加載widget模塊。那麼請看RequireJS


更新: 參考標籤的好處是,你能夠引用類型,而無需將其導入。你想在打字稿代碼

  • 或自己的代碼使用現有的JavaScript庫,這可以在案件有用

    在後一種情況下,例如假設您有其他代碼需要變量爲Button類型,但您實際上並不需要該類本身。

    class MyClassThatReferencesButtonButDoesNotActuallyNeedsTheImplementation { 
        myMethodThatExpectsAButton(someVar:Button) { 
         someVar.text = "My button!"; 
        } 
    } 
    

    類不需要的Button實施,它只是需要知道哪些屬性和方法可用就可以了。如果您知道如果導入而不是引用了Button,則需要通過JavaScript模塊加載器加載,這一優勢變得更加清晰。

    在第一種情況下,假設您的Button類需要jQuery。你是否要將jQuery與你的課程一起包括在內?或者你會認爲這是全球可用的?從本質上講,這與上面的情況是一樣的:你不需要一個TypeScript實現jQuery,你只需要知道什麼屬性和方法可用,因此你只需要引用jQuery的定義文件。

    --out標誌僅用於包含引用文件。如果您有imported模塊,則需要編譯所有文件,然後使用RequireJS優化器將輸出構建爲單個文件。

  • +1

    感謝您的回答。我想使用參考標籤的原因。請通過上面的更新問題閱讀。順便說一下,假設你知道的更好,請詳細說明在Typescript中引用參考標記有什麼好處,因爲在大多數情況下,我們必須使用import/require語句呢? – EternallyCurious

    +0

    順便說一下,我已經有RequireJS – EternallyCurious

    +0

    包含引用文件正是我想要的 - 我怎麼能得到 - 鑑於超類定義在一個導出的模塊內,但子類不是 - 因爲它在一個不同的文件。事實上,我只是試着把子類「Button」放在一個同名的模塊中,假設Typescript編譯器在包含它們的時候將它們合併。那也行不通。那個方向有什麼想法?我非常感謝你的幫助。 – EternallyCurious