Typescript枚举,用于实现和接口。

7

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

export enum CommandEnum {
    createProject,
    renameProject,
    hablaBabla
}

在一个模块中,我能够从实现代码中引用它,使用的方法是:
import {CommandEnum} from '../server/contracts/CommandEnum'

let x = CommmandEnum.hablaBabla

枚举文件被编译成了一个带有导出逻辑的JavaScript函数,位于CommandEnum.js文件中。

现在它可以正常工作,但我也想在我的接口中引用这个枚举,尝试了以下代码:

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

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

现在,这个引用没有导入CommandEnum类型,但是我尝试过的其他模块/命名空间/默认导出组合却可以。我可以让参考语法工作,但不能同时让模块语法和另一种方式同时工作。
这真的可能吗?从一个纯定义接口文件中使用枚举似乎是一个非常常见的情况。但是当接口被实现时,枚举必须以“函数形式”可用,而这两种模型似乎无法结合?
我在类上也遇到了同样的问题,我想将其命名空间化,像.Net一样,但我必须放弃。然而,在我的接口中没有引用类 - 只有枚举。
我使用node.js并编译为单独的文件,而不是单个合并输出。
1个回答

3

这个现在可以正常工作,但是我也想在我的接口中引用这个枚举

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

例如:myEnumGlobalDeclare.ts

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

例如: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


@baserat,谢谢。我理解你建议在项目/子域中使用单个合同文件 - 包含所有枚举和接口?这可能会解决问题,但我认为它可能会导致某些项目中非常重的类型文件...目前,我将在接口中使用字符串,在实现中使用枚举。 - Jørgen Tvedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接