2013-07-25 82 views
2

我有一組的打字稿文件被編譯成*.d.ts文件,它不斷雖然示數對我來說:打字稿定義文件內部模塊

systems.debug.d.ts(280,41): error TS2094: The property 'Models' does not exist on value of type 'Systems'.

聲明如下:

declare module Systems.Services.Stuff { 
    class DefaultHubService { 
     public Send(entry: Systems.Models.IEntry, successCallback: Function, failureCallback: Function): void; 
    } 
} 

這發生在280線(systems.debug.d.ts),它正在努力參考的東西是:

declare module Systems.Models { 
    interface IEntry { 
     Version: string; 
     Content: KnockoutObservableString; 
     DateCreated: KnockoutObservableDate; 
     CreatorAccountId: KnockoutObservableString; 
    } 
} 

這是239線(systems.debug.d.ts),所以我覺得很奇怪,不知道如何解決這個問題。由於界面包含在服務之前,它應該對我的知識起作用,除非TypeScript存在一些問題。任何人都可以解釋錯誤?

== ==編輯

只是提供一些額外的信息櫃面它可以幫助診斷問題...

實際實現是這樣的:

// Systems/Services/Stuff/default-hub-service.ts 
module Systems.Services.Stuff { 
    export class DefaultHubService { 
     public Send(entry: Models.IEntry, successCallback: Function, failureCallback: Function): void 
     { 
      // Do something here 
     } 
    } 
} 

// Systems/Models/ientry.ts 
module Systems.Models { 
    export interface IEntry { 
     Version: string; 
     Content: KnockoutObservableString; 
     DateCreated: KnockoutObservableDate; 
     CreatorAccountId: KnockoutObservableString; 
    } 
} 

有中沒有引用個人文件,因爲我有一個根級別的參考文件,其中包含所有要使用的外部引用,並且因爲它首先包含在編譯參數中,它提供了所有外部依賴關係(即knockout.d.ts,jquery.d.ts等) 。

我正在使用Typescript 0.9.0.1,並通過直接從我的構建腳本調用tsc.exe進行編譯。最後,javascript輸出文件創建時沒有錯誤,所以我有一個systems.debug.js編譯好,但是聲明標誌只有它引發錯誤的d.ts文件。

回答

1

找出是什麼引起的!

哇這是一個瘋狂的...我不確定我是否完全理解它,因爲我發現它僥倖。

我有一個文件,像這樣:

module Systems.Services.Systems 
{ 
    export class GameSystemService 
    { 
     // stuff 
    } 
} 

現在,通過在操場打字稿嘗試時(因爲有相同的錯誤,因爲我),我不小心刪除了這一個,所有的錯誤就走開了。然後把它放回去,試着刪除別人,錯誤仍然存​​在...所以我知道這一定是與此有關...

現在我假設錯誤是因爲模塊名稱是Systems.Services.Systems,並在編譯時這個聲明令人驚訝,因爲它必須認爲第二個Systems與第一個或其他東西是一樣的..我不太確定是什麼原因造成Typescript炸燬所有其他東西,但我通過將其重命名爲:

module Systems.Services.GameSystems

然後一切正常。不知道這是否歸類爲打字稿中的錯誤或者是我的編碼問題,因爲我沒有意識到任何有名稱空間重複名稱的問題......

無論如何,修復它......瘋了。 ..感謝您的幫助傢伙!

1

當我嘗試你的代碼,我沒有得到一個錯誤 - 這裏是我使用的是完整的示例:

declare class KnockoutObservableString {} 
declare class KnockoutObservableDate {} 

declare module Systems.Models { 
    interface IEntry { 
     Version: string; 
     Content: KnockoutObservableString; 
     DateCreated: KnockoutObservableDate; 
     CreatorAccountId: KnockoutObservableString; 
    } 
} 

declare module Systems.Services.Stuff { 
    class DefaultHubService { 
     public Send(entry: Systems.Models.IEntry, successCallback: Function, failureCallback: Function): void; 
    } 
} 

var x = new Systems.Services.Stuff.DefaultHubService(); 
var y: Systems.Models.IEntry; 

tried this in the TypeScript Playground,並在Visual Studio與0.9.0.1打字稿的Visual Studio擴展。在Visual Studio中,我將環境聲明分隔到名爲systems.debug.d.ts的文件中,並將該聲明用於app.ts

+0

我不知道該告訴你什麼,我編譯多個文件,當生成'* .js'文件時,'* .d.ts'文件記錄上面顯示的錯誤,以及其他一些錯誤一模一樣。其他東西發現模塊內找不到。我忽略了保持簡單問題的唯一的事情是我也引用了其他生成的'* .d.ts'文件(它不會出錯並且看起來很好)。因此,例如'Systems'模塊引用'Shared'模塊,但共享編譯好的沒有問題。有0 *真正*錯誤,就像這些無法找到錯誤中的10個。 – Grofit

+0

你使用的是TypeScript 0.9.0.1還是早期版本? – Fenton

+0

我正在使用最新版本0.9.0.1,我將嘗試通過打字機遊樂場以後運行我的文件(如在我的家用機器上)。看看是否標記任何東西。我發現奇怪的另一件事是實際的類實現不包含命名空間的系統部分,但聲明放入它,我沒有看到它做任何錯誤,但不知道如果這是與它有什麼關係或一個紅色的鯡魚......將在它幫助的問題中放入示例類實現。 – Grofit

0

既然你是在多個步驟中進行編譯也許問題.d.ts定義不導出在生成.d.ts即說你有a.d.ts爲:

interface Foo{ 
    var boo:number; 
} 

,你有一個.d.ts文件b.ts

///<reference path="a.d.ts" 
    class Bar implements Foo{ 
     boo:number; 
    } 

,你爲編譯:

tsc a.d.ts b.ts --out out.js --declaration 

文件out.d.ts不會在其中包含接口Foo。

+0

這就是我改變我的方法的原因,因爲之前我有自包含的模塊,它們只是互相流血,所以這就是爲什麼我想移動到只包含聲明文件,所以它知道類型存在,只是期望它們在運行時被包含。在這種情況下,所有東西都有一個類似於格式的名稱空間,所以即使在不同文件中有2個foo類,它們也會位於不同的名稱空間中。我看到的具體問題是在相同模塊中引用一個對象,該對象也在同一個文件中。 – Grofit