typescript 枚举和外部模块(browserify)

标签 typescript browserify

直到现在,我一直在使用 typescript 内部模块,并包含 10 多个脚本标签来引导我的应用程序。我目前正在将项目转换为使用外部模块(使用 browserify),但我仍然不知道应该如何转换枚举。

我曾经有过这样的东西:

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

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

var val:mymodule.submodule.MyEnum = mymodule.submodule.MyEnum.one;

并且正确编译为 js。将项目转换为使用外部模块后,我将所有接口(interface)移动到 *.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

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

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

更新 关于接口(interface)声明: 可能不清楚为什么我将原始枚举声明保留在 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 语句,所以如何在所有情况下都使用一个枚举声明?

最佳答案

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

将代码更改为以下内容:

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

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

关于更新

要让枚举与接口(interface)一起工作,您可以将接口(interface)移出声明文件 (interfaces.d.ts) 并从 typescript 文件中导出它们(例如 接口(interface).ts):

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

export interface ISomething {
   aValue: Enums.MyEnum;
   aFunction: (anArg: Enums.MyEnum) => void;
}

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

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

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

关于 typescript 枚举和外部模块(browserify),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31007312/

相关文章:

typescript - 检测 TypeScript 中的循环依赖

typescript - 为什么类型检查器不返回这个可索引类型的错误?

javascript - 始终启用 'use strict' ;默认情况下?

javascript - babelify 转换不转译胖箭头

typescript - 我可以在 TypeScript 中创建一个对每个键值对都是类型安全的键值字典吗?

typescript - 改变 Vue/Nuxt 中的本地属性( typescript )

javascript - typescript |与端点的接口(interface)

jquery - 捆绑(webpack/browserify)是否比通过 CDN 更快?

javascript - Uncaught Error : Module name "twilio" has not been loaded yet

google-closure-compiler - 使用 Google Closure Compiler 使 browserify 工作