如何在定义文件中引用Typescript枚举

Bra*_*don 7 enums amd requirejs typescript visual-studio-2013

我正在使用安装了更新4和Typescript 1.3的Visual Studio 2013.

如果我有一个打字稿文件,如下所示:

MyEnums.ts:

export = MyEnumModule;
module MyEnumModule {
    export enum AnEnum { RED, BLUE, GREEN }
}
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的定义文件:

MyDefinitions.d.ts:

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

我基本上得到一个错误"找不到名字'MyEnumModule'"

从typescript文件引用时,此枚举文件可正常工作.例如:

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
Run Code Online (Sandbox Code Playgroud)

我的理解是添加/// <reference...或导入将不适用于.d.ts文件(我试图确保它看起来无论如何都不起作用).

有谁知道如何在这样的定义文件中引用枚举?

提前致谢.

--update:

这是我在尝试下面的Steve Fenton建议后看到的错误(我刚刚制作了一个示例项目).

MyDefinitions.ts:

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

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

MyEnums.ts:

export = MyEnumModule;

module MyEnumModule {
    export enum AnEnum { RED, BLUE, GREEN }
}
Run Code Online (Sandbox Code Playgroud)

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;       
}
Run Code Online (Sandbox Code Playgroud)

}

文件夹结构:
App

  • -MyClass.ts
  • -MyEnums.ts

  • Defintions
  • -MyDefintions.d.ts
  • 在MyClass.ts内部MyDefinitions.ISomeInterface以红色下划线,并带有悬停警告"无法找到名称MyDefinitions".

    我有AMD为该项目设置

    Fen*_*ton 2

    我对此进行了检查,并且以下定义对我有用,尽管我必须承认我从未从“定义”代码中引用过“实际”代码 - 但我想不出任何不这样做的理由。

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

    关于混合定义和实际实现......

    TypeScript 中的类型系统是一个设计时和编译时工具。当类型信息在设计时构造时,无论类型信息是从实现代码推断、从装饰实现的注释获取还是来自环境声明,都没有区别。

    有许多混合实现代码和环境声明的用例 - 如果您要将一百万行 JavaScript 程序迁移到 TypeScript,您可能无法将其从最底层的依赖项向上迁移。此外,您可以将环境声明放置在普通文件中 - 不仅仅是定义文件 - 如果您有一个大型程序,您甚至可能不知道放置在环境声明中的类型是“真实的”还是“环境的”。

    实现代码类型和环境声明类型之间的唯一区别在于,类型信息紧邻实际代码文件中的实现,以及环境声明的单独文件。

    所以...如果您在环境声明中使用实际实现的类型时遇到问题,很可能是由可以修复的问题引起的。我上面提供的示例适用于 Visual Studio 2013 Update 4 中的一个项目 - 使用 TypeScript 构建配置集来编译 AMD 模块。如果您可以分享问题的具体细节,我很乐意帮助您解决问题。

    话虽如此,如果您要为少量代码创建类型定义,将它们粘贴到文件中.ts甚至可能比编写定义更快,因此您应该根据具体情况决定在哪里花费精力。