【问题标题】:Typescript enums and external modules (browserify)Typescript 枚举和外部模块(浏览器)
【发布时间】:2015-09-09 12:28:19
【问题描述】:

到目前为止,我一直在使用 typescript 内部模块并包含 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 语句,那么如何在所有情况下都使用一个枚举声明?

【问题讨论】:

    标签: typescript browserify


    【解决方案1】:

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

    把代码改成如下:

    import Enums = require('./enums');
    var val1: Enums.MyEnum = Enums.MyEnum.one; // no error
    

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

    关于更新

    要让枚举与接口一起使用,您可以将接口移出声明文件 (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'); }
    };
    

    【讨论】:

    • 那么我该如何在接口声明中使用这些枚举呢?我将更新我的问题以显示此问题。
    • @mxa055 基本上,将所有代码移出声明文件。我编辑了我的答案以显示一个例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 2015-07-31
    • 2014-04-05
    • 2018-12-31
    • 1970-01-01
    • 2016-03-18
    相关资源
    最近更新 更多