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

时间:2014-11-21 18:42:23

标签: visual-studio-2013 enums requirejs typescript amd

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

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

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'”

的错误

这个枚举文件从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

我的理解是,添加/// <reference ...或导入将不适用于.d.ts文件(我只是为了确定并且它似乎无法正常工作)。< / p>

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

提前致谢。

- 更新:

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

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

    2 个答案:

    答案 0 :(得分:4)

      

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

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

    答案 1 :(得分:2)

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

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

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

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

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

    实现代码类型和环境声明类型之间的唯一区别是类型信息紧挨着实际代码文件中的实现,并且位于单独的环境声明文件中。

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

    说完这个 - 如果你要为大量代码创建一个类型定义,将它们粘贴到.ts文件中甚至可能比编写定义更快 - 所以你应该做出逐案决策在哪里花费精力。

    相关问题