【问题标题】:Typescript enum, used from implementation and interfacesTypescript 枚举,用于实现和接口
【发布时间】:2016-09-03 15:46:19
【问题描述】:

我在 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 并编译为单个文件,而不是单个连接输出。

【问题讨论】:

    标签: enums typescript


    【解决方案1】:

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

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

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

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

    更多

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

    【讨论】:

    • @baserat,谢谢。我认为您为项目/子域推荐了一个合同文件 - 包含所有枚举和接口?这可能会解决问题,但我相信它可能会导致某些项目中的类型文件非常重......现在我将只在接口中使用字符串并在实现中使用枚举。
    猜你喜欢
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2014-07-11
    • 2023-04-03
    • 1970-01-01
    • 2019-01-20
    • 2020-11-28
    相关资源
    最近更新 更多