2013-08-22 55 views
2

我在我的一個項目中遇到了一些意想不到的行爲,所以我將它隔離到了我能夠解決問題的最小示例。我使用的是最新的打字稿建立0.9.1.1用常量重載

module module2 { 

    export interface IAnimal { 

     colour:string; 
    } 
} 

module module1 { 

    export interface IInjector { 
     get(className:string):void; 
    } 
} 

module module1 { 

    export interface IInjector { 
     get(className: "module2.IAnimal"):module2.IAnimal; 
    } 

    class Injector implements module1.IInjector { 

     public get(className:string):any { 

      return {colour:"Blue"}; 
     } 
    } 

    export var injector:IInjector = new Injector(); 
} 

module module2 { 

    module1.injector.get("module2.IAnimal").surname; 
} 

產生預期的錯誤 錯誤TS2094:屬性「姓」不會對類型的值「IAnimal」存在。

如果我換了前兩名的模塊DEFS我不再得到預期的錯誤

module module1 { 

    export interface IInjector { 
     get(className:string):void; 
    } 
} 

module module2 { 

    export interface IAnimal { 

     colour:string; 
    } 
} 

module module1 { 

    export interface IInjector { 
     get(className: "module2.IAnimal"):module2.IAnimal; 
    } 

    class Injector implements module1.IInjector { 

     public get(className:string):any { 

      return {colour:"Blue"}; 
     } 
    } 

    export var injector:IInjector = new Injector(); 
} 

module module2 { 

    module1.injector.get("module2.IAnimal").surname; 
} 

其實我想的錯誤顯示,以表示我已經在IDE中的錯誤。我的問題是爲什麼它會顯示第一個例子,而不是第二個?

+0

這是真棒布倫丹。看起來像一個編譯器錯誤,雖然 – basarat

回答

0

好的,我已經做了一些挖掘。該代碼的作用就好像在聲明之前使用了接口IAnimal。通過一次性聲明整個IInjector接口,但在定義IAnimal之前,可以獲得類似的行爲。

module module1 { 
    export interface IInjector { 
     get(className: "module2.IAnimal"):module2.IAnimal; 
     get(className:string):void; 
    } 
} 

module module2 { 
    export interface IAnimal { 
     colour:string; 
    } 
} 

module module1 { 
    class Injector implements module1.IInjector { 
     public get(className:string):any { 
      return {colour:"Blue"}; 
     } 
    } 

    export var injector:IInjector = new Injector(); 
} 

module module2 { 
    // x is any 
    var x = module1.injector.get("module2.IAnimal"); 
} 

也許當打字稿編譯器推出的所有接口聲明爲一個它會將它們好像他們是最早宣佈的位置,所以你必須確保所有的依賴關係是此點之前。 (注意:我不是說這是正確的,我只是說它是如何表現的)。

你的下一步是check the TypeScript issues list,如果你找不到這個bug報告,那麼可以將它添加進去,這樣既可以按照預期的行爲進行確認,也可以將其確定爲否。

+0

謝謝史蒂夫。關於接口聲明的思考都放在最早的位置幫助我構造我的代碼。這個理論支持我如何重組我的「/// <參考路徑= ....>」的順序。我的上述代碼的目標是創建一個簡單的依賴注入器,我可以在註冊我的具體類時添加註釋接口,幷包含相應的類型接口。 –