2014-11-21 24 views
7

我正在使用安裝了Update 4和Typescript 1.3的Visual Studio 2013。如何在定義文件中引用Typescript枚舉

如果我有一個打字稿文件,像這樣:

MyEnums.ts:

export = MyEnumModule; 
module MyEnumModule { 
    export enum AnEnum { RED, BLUE, GREEN } 
} 

而且我有一個定義文件,如下所示:

MyDefinitions.d.ts:

declare module MyDefinitions { 
    interface ISomeInterface { 
     aProperty: string; 
     aMethod:() => void; 
     aColor: MyEnumModule.AnEnum; 
    } 
} 

我基本上得到一個錯誤「找不到名字'MyEnumModule'」

這個枚舉文件從打字稿文件引用時工作正常。例如:

SomeCode.ts:

export = MyCode; 

import MyEnums = require('MyEnums'); 

module MyCode{ 

    export class MyClass implements ISomeInterface { 
     public aColor: MyEnums.AnEnum = MyEnums.AnEnum.RED; 
     ...and so on 

我的理解是,要麼加入... /// <reference或進口不會對.d.ts文件工作(我試過只是要確定它似乎沒有工作)。

有誰知道如何在像這樣的定義文件中引用枚舉?

在此先感謝。

--update:

這裏是試圖下面(有我只是做了一個樣本項目)史蒂夫芬頓建議後,我看到的錯誤。

MyDefinitions.ts

import MyEnumModule = require('../App/MyEnums'); 

declare module MyDefinitions { 
    interface ISomeInterface { 
     aProperty: string; 
     aMethod:() => void; 
     aColor: MyEnumModule.AnEnum; 
    } 
} 

MyEnums.ts

export = MyEnumModule; 

module MyEnumModule { 
    export enum AnEnum { RED, BLUE, GREEN } 
} 

MyClass.ts

export = MyCode; 
import MyImport = require('MyEnums'); 
module MyCode { 
    export class MyClass implements MyDefinitions.ISomeInterface { 
     public aColor: MyImport.AnEnum = MyImport.AnEnum.RED; 
     constructor() { } 
     aProperty: string = ""; 
     aMethod:() => void = null;  
} 

}

文件夾結構
應用

  • -MyClass.ts
  • -MyEnums.ts

  • Defintions
  • -MyDefintions.d.ts
  • 內MyClass.ts MyDefinitions.ISomeInterface帶有懸停警告的紅色下劃線「無法找到名稱MyDefinitions」。

    我有AMD爲項目設置

    +0

    只要您使用Visual Studio 2013和d.ts是在同一個項目作爲您的.ts文件,你不需要包含文件本身的任何東西。確保它們在同一模塊中,儘管首先作爲測試以確保它可以正常工作 – John 2014-11-21 18:45:52

    +0

    謝謝,我爲AMD設置了Web應用程序項目的模塊系統。枚舉文件和定義文件位於不同的文件夾中。定義文件當前被用作公共點來保存文件在整個項目中使用的引用。我不認爲使用AMD的模塊名稱會起作用嗎? – Brandon 2014-11-21 18:55:48

    +0

    我很久沒有使用AMD了,所以不記得它是如何進口這些日子,所以不知道。我知道用VS你不需要再包含'///引用',這很好。我會嘗試使用相同的模塊都得到它的工作,然後自己一開始就與AMD – John 2014-11-21 19:25:02

    回答

    2

    我對這樣的檢查,以下定義爲我的作品,但我必須承認,我從來沒有提及從「定義」代碼「實際」代碼 - 但我不能想不到任何理由。

    import MyEnumModule = require('MyEnumModule'); 
    
    declare module MyDefinitions { 
        interface ISomeInterface { 
         aProperty: string; 
         aMethod:() => void; 
         aColor: MyEnumModule.AnEnum; 
        } 
    } 
    

    在混合的定義和實際實現...

    類型系統中打字稿是設計時和編譯時的工具。當類型信息在設計時被構造時,類型信息是從實現代碼中推斷出來的,取自裝飾實現的註釋或來自環境聲明的類型信息。

    混合實現代碼和環境聲明有許多用例 - 如果要將百萬行JavaScript程序遷移到TypeScript,您可能無法將其從最底層的依賴項向上遷移。此外,您可以將環境聲明放置在普通文件中 - 而不僅僅是定義文件 - 如果您有大型程序,則甚至可能不知道您放置在環境聲明中的類型是「真實」還是「環境」。

    實現代碼類型和環境聲明類型之間的唯一區別是該類型的信息是正確的旁邊真正的代碼文件的執行情況,並在環境聲明一個單獨的文件。

    所以......如果你在你的環境聲明中使用真正實現類型的一個問題,這是最有可能的東西,可以固定所致。我上面提供的示例在Visual Studio 2013 Update 4中的項目中工作 - 使用TypeScript構建配置來編譯AMD模塊。如果您可以分享問題的確切詳情,我很樂意幫助您實現這一目標。

    說了這麼一句 - 如果你爲一小撮數量的代碼創建一個類型定義,將它們粘貼到一個.ts文件中甚至可能比編寫該定義更快 - 所以你應該做出一個個案決定,花費精力。

    +1

    工作,我想這一點,但它造成的代碼文件無法找到的定義(這就像進口導致一些問題)。我猜basarat是對的,但你也指出了這個方向。 – Brandon 2014-11-26 20:44:28

    +0

    我已經更新了我就因爲我無法在評論適應它:) – Fenton 2014-11-26 21:00:50

    +1

    謝謝你不能混用實施和申報代碼的建議答案,那就是好消息。我用一些額外的細節更新了我的OP。 – Brandon 2014-11-28 14:55:11

    4

    有誰知道如何在這樣的定義文件中引用枚舉?

    史蒂芬芬頓指出,有一種解決方法,但系統不是爲此設計的。您應該在您的定義文件中引用其他定義文件,而不是在定義文件中引用*實現文件*(MyEnum.ts)。

    +3

    我傾向於這個,有道理的是定義不應該涉及到實現。我想到了,意識到我專注於「如何」而不是「我應該」。一位同事製作了d.ts文件,起初我並沒有質疑其有效性,但我只是把它變成了一個.ts(我感覺d.ts主要是爲現有的js提供打字功能)和它工作得很好。對於類型文件如何指定枚舉類型,我仍然感到困惑? – Brandon 2014-11-26 20:40:28