Typescript枚举,用于实现和接口

时间:2016-05-09 05:45:23

标签: enums typescript

我在CommandEnum.ts中有以下内容:

export enum CommandEnum {
    createProject,
    renameProject,
    hablaBabla
}

在一个模块中,我可以使用

从实现代码中引用
import {CommandEnum} from '../server/contracts/CommandEnum'

let x = CommmandEnum.hablaBabla

在CommandEnum.js中将枚举文件编译为带导出逻辑的javascript函数。

这现在工作正常,但我想在我的界面中引用这个枚举,我尝试:

/// <reference path="../contracts/CommandEnum.ts" />
namespace ValueTypes {

    export interface Command {
        type : CommandEnum;
        referenceId : string;
    }
}

现在,这个引用不会导入CommandEnum类型,但是我尝试过一些其他的modules / namespace / export组合。 我可以使用参考语法,但不能使用模块语法,反之亦然 - 但不能同时使用。

这实际上可行吗?使用纯定义接口文件中的枚举似乎是一种非常常见的场景。但是当实现接口时,枚举必须以“函数形式”提供,并且这两个模型似乎不能合并?

我遇到了类的问题,我想要命名空间,.Net风格 - 我不得不放弃。但是,我的接口中没有引用类 - 枚举是。

我使用node.js并编译为单个文件,而不是单个的连接输出。

1 个答案:

答案 0 :(得分:3)

  

这现在工作正常,但我想在我的界面中引用这个枚举

您可以将module中的内容移动到全局命名空间使用declare global

E.g。 myEnumGlobalDeclare.ts

import {MyEnum as MyEnumModule} from "./myEnum";
declare global {
   declare var MyEnum: typeof MyEnumModule;
}

E.g。 myEnumGlobalDefine.ts

import {MyEnum as MyEnumModule} from "./myEnum";
MyEnum = MyEnumModule;

或类似的东西^。当然,这意味着您的运行时应该支持全局扩充,例如在nodejs中,您需要使用globals和浏览器window

更多

我绝对不建议走这条路。而是创建一个全局types.ts模块,并在任何地方使用它。例如。 alm有这个文件:https://github.com/alm-tools/alm/blob/master/src/common/types.ts