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

Visual studio 2013 如何在定义文件中引用Typescript枚举,visual-studio-2013,enums,requirejs,typescript,amd,Visual Studio 2013,Enums,Requirejs,Typescript,Amd,我正在使用安装了更新4和Typescript 1.3的Visual Studio 2013 如果我有一个typescript文件,如下所示: MyEnums.ts: export=MyEnumModule; 模块MyEnumModule{ 导出枚举AnEnum{红色、蓝色、绿色} } 我有这样一个定义文件: MyDefinitions.d.ts: 声明模块定义{ 接口等距接口{ 属性:字符串; 方法:()=>无效; aColor:茴香; } } 我基本上得到一个错误“找不到名称'MyEnum

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

如果我有一个typescript文件,如下所示:

MyEnums.ts:

export=MyEnumModule;
模块MyEnumModule{
导出枚举AnEnum{红色、蓝色、绿色}
}
我有这样一个定义文件:

MyDefinitions.d.ts:

声明模块定义{
接口等距接口{
属性:字符串;
方法:()=>无效;
aColor:茴香;
}
}
我基本上得到一个错误“找不到名称'MyEnumModule'”

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

SomeCode.ts:

export=MyCode;
导入MyEnums=require('MyEnums');
模块代码{
导出类MyClass实现了一个接口{
公共颜色:MyEnums.AnEnum=MyEnums.AnEnum.RED;
等等

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

import MyEnumModule = require('MyEnumModule');

declare module MyDefinitions {
    interface ISomeInterface {
        aProperty: string;
        aMethod: () => void;
        aColor: MyEnumModule.AnEnum;
    }
} 
关于混合定义和实际实现

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

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

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

因此…如果您在环境声明中使用实际实现的类型时遇到问题,很可能是由于某些可以修复的问题造成的。我上面提供的示例适用于我在Visual Studio 2013中的一个项目,更新4-将TypeScript构建配置设置为编译AMD模块。如果您可以共享pr的确切详细信息问题,我很乐意帮你让它工作

话虽如此,如果您要为少量代码创建类型定义,那么将它们粘贴到
.ts
文件甚至可能比编写定义还要快,因此您应该逐个决定在何处花费精力

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


正如Steve Fenton所指出的,有一些解决方法,但系统不是为此而设计的。您应该在定义文件中引用其他定义文件,而不是引用*实现文件*(
MyEnum.ts
)在定义文件中。

只要您使用visual studio 2013,并且d.ts与.ts文件位于同一个项目中,您就不需要在文件本身中包含任何内容。确保它们位于同一个模块中,但首先作为测试以确保其工作。谢谢,我为AMD设置了web应用程序项目的模块系统。枚举文件and定义文件位于不同的文件夹中。定义文件目前被用作一个公共点,用于保存整个项目中文件使用的引用。我认为使用AMD时模块名称无关紧要?我已经很长时间没有使用AMD了,所以不记得这些天它是如何导入的,所以不确定。我确实知道使用VS时您不需要再加上
///引用
,这很好。我会尝试使用同一个模块让两者都工作,然后担心AMDI是否能工作。我倾向于这一点,这是有道理的。定义不应该引用实现。我想了想,意识到我关注的是“如何”而不是“我应该”.一位同事创建了d.ts文件,起初我并没有质疑它的有效性,但我只是将它转换成了一个.ts(我感觉d.ts主要是为现有的js提供键入功能?)它工作得很好。我仍然对类型文件如何指定枚举类型感到困惑?我尝试了这个,但它导致代码文件无法找到定义(好像导入导致了一些问题)。我想basarat是对的,但你也指出了这个方向。我已经更新了我的答案,关于不能将实现代码和声明代码混合在一起的建议,因为我无法将其放在评论中:)谢谢,这是一个很好的信息。我用一些额外的细节更新了我的OP。有两个更改来解决这个问题…1.在MyDefinitions
export=MyDefiniti中选项;
和2.在MyClass中
导入MyDefinitions=require('MyDefinitions');
。错过了这一点,谢谢!不得不使用import MyDefinitions=require('../Definitions/MyDefinitions');,但在那之后它工作得很好。在过去的10年里,我大部分时间都是C,我猜typescript让我的大脑感到不安:)
export = MyEnumModule;

module MyEnumModule {
    export enum AnEnum { RED, BLUE, GREEN }
}
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;       
}
import MyEnumModule = require('MyEnumModule');

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