到目前为止,我正在使用打字稿内部模块,并包含10个脚本标签来引导我的应用程序。我目前正在将项目转换为使用外部模块(使用browserify)但我仍然坚持如何转换枚举。
我曾经有类似的东西:
mymodule.submodule {
enum MyEnum {
one,
two,
three
}
}
我会在其他模块中使用它:
var val:mymodule.submodule.MyEnum = mymodule.submodule.MyEnum.one;
并且这正确编译为js。在将项目转换为使用外部模块之后,我将所有接口都移动到* .d.ts文件中,并考虑将枚举放在那里,但当然这会产生错误,因为在js中枚举和数字之间没有映射。 然后我将枚举移动到* .ts文件,以便编译它们。问题是如果我把它们写成:
export enum MyEnum{
one,
two,
three
}
export enum OtherEnum {
four,
five,
six
}
适用于要求我的代码中的枚举为:
import Enums = require('./enums');
var val = Enums.MyEnum.one; //this works
var val1: mymodule.submodule.MyEnum = Enums.MyEnum.one; //ERROR: incompatible types
但是与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;
}
}
据我所知,我不能在.d.ts文件中使用import语句,那么如何在所有情况下使用一个枚举声明呢?
答案 0 :(得分:1)
枚举需要在TS文件中,因为枚举被编译为JavaScript。使用模块时,需要导入枚举以供使用(即使仅用于定义变量的类型)。
将代码更改为以下内容:
import Enums = require('./enums');
var val1: Enums.MyEnum = Enums.MyEnum.one; // no error
此外,如果在mymodule.submodule
中定义了枚举,则不应在enums.ts
中。从定义文件中删除它们。
关于更新
要使枚举与接口一起使用,您可以将接口移出声明文件(interfaces.d.ts
)并从打字稿文件(例如interfaces.ts
)中导出它们:
import Enums = require('./enums');
export interface ISomething {
aValue: Enums.MyEnum;
aFunction: (anArg: Enums.MyEnum) => void;
}
然后您可以使用如下界面:
import Interfaces = require('./interfaces');
import Enums = require('./enums');
var example: Interfaces.ISomething = {
aValue: Enums.MyEnum.one,
aFunction: (example: Enums.MyEnum) => { console.log('example'); }
};