打字稿枚举和外部模块(browserify)

mas*_*plo 5 browserify typescript

到目前为止,我正在使用打字稿内部模块,并包含10个脚本标签来引导我的应用程序.我目前正在将项目转换为使用外部模块(使用browserify),但我仍然坚持要如何转换枚举.

我曾经有类似的东西:

mymodule.submodule {
     enum MyEnum {
        one,
        two,
        three
     }
}
Run Code Online (Sandbox Code Playgroud)

我会在其他模块中使用它:

var val:mymodule.submodule.MyEnum = mymodule.submodule.MyEnum.one;
Run Code Online (Sandbox Code Playgroud)

并且这正确编译为js.在将项目转换为使用外部模块之后,我将所有接口都移动到*.d.ts文件中,并考虑将枚举放在那里,但当然这会产生错误,因为在js中枚举和数字之间没有映射.然后我将枚举移动到*.ts文件,以便编译它们.问题是如果我把它们写成:

export enum MyEnum{
    one,
    two,
    three
}

export enum OtherEnum {
    four,
    five,
    six
}
Run Code Online (Sandbox Code Playgroud)

这适用于要求我的代码中的枚举如下:

import Enums = require('./enums');
var val = Enums.MyEnum.one; //this works
var val1: mymodule.submodule.MyEnum = Enums.MyEnum.one; //ERROR: incompatible types
Run Code Online (Sandbox Code Playgroud)

但是与mymodule.submodule.MyEnum类型不兼容.那么我怎样才能同时拥有枚举类型的声明,这样我就可以在d.ts文件中声明变量类型,还可以依赖实际生成的枚举代码(以便正确加载)并在.ts文件中使用?

注意:这些枚举用于许多模块,因此将它们包含在同一文件中并不是解决方案.

关于接口声明的更新:可能不清楚为什么我在d.ts文件中保留原始枚举声明,所以我要添加一个示例.

在interfaces.d.ts我目前有:

declare module mymodule.submodule {
    enum MyEnum{
       one,
       two,
       three
    }

    interface ISomething{
       aValue: MyEnum;
       aFunction: (anArg: MyEnum) => void;
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,我不能在.d.ts文件中使用import语句,那么如何在所有情况下使用一个枚举声明呢?

Dav*_*ret 1

枚举需要位于 TS 文件中,因为枚举会编译为 JavaScript。使用模块时,需要导入枚举才能使用(即使只是用于定义变量的类型)。

将代码更改为以下内容:

import Enums = require('./enums');
var val1: Enums.MyEnum = Enums.MyEnum.one; // no error
Run Code Online (Sandbox Code Playgroud)

mymodule.submodule此外,如果枚举是在 中定义的,则它们不应位于 中enums.ts。从定义文件中删除它们。

关于更新

要使枚举与接口一起使用,您可以将接口移出声明文件 ( interfaces.d.ts) 并从打字稿文件(例如interfaces.ts)中导出它们:

import Enums = require('./enums');

export interface ISomething {
   aValue: Enums.MyEnum;
   aFunction: (anArg: Enums.MyEnum) => void;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用接口:

import Interfaces = require('./interfaces');
import Enums = require('./enums');

var example: Interfaces.ISomething = {
    aValue: Enums.MyEnum.one,
    aFunction: (example: Enums.MyEnum) => { console.log('example'); }
};
Run Code Online (Sandbox Code Playgroud)