【问题标题】:Typescript global enum that gets inlined on compilation在编译时内联的打字稿全局枚举
【发布时间】:2019-02-26 16:43:15
【问题描述】:

我有一个枚举,在我的项目中几乎无处不在。我不想在每个文件中都导入它。有没有办法在.d.ts 文件中定义一个枚举,以便在编译为 js 时内联?

在我尝试过的types/global.d.ts 文件中

declare enum MessageType {
    DIRECT = 'direct',
    FORWARDED = 'forwarded'
}

当我运行应用程序时,我在代码中的某处收到MessageType.DIRECT is not defined 错误,我尝试使用它。我从来没有导入过这个枚举,因为 tslint 可以识别它并且自动完成功能也可以。

我也试过declare const enum ...,效果一样。

有什么想法吗?

【问题讨论】:

标签: typescript enums


【解决方案1】:

通过使用declare,您创建了一个环境枚举,这意味着您正在定义现有对象的形状,因此这只是生成类型,而不是实际对象。

如果您删除 declare,它将同时创建枚举类型和对象

https://www.typescriptlang.org/docs/handbook/enums.html 有更多关于环境枚举的细节

【讨论】:

  • tslint 强制我使用声明。我应该把我的枚举放在哪里,这样它才能保持全局,我不必每次都导入它?我不需要全局运行时,我希望它在我的代码中保持全局并在编译时内联到字符串
  • @George 如果您希望每次都内联它,则无需发出运行时代码。只使用declare const enum 就可以了——你不应该得到MessageType.DIRECT is not defined 错误,因为这只会转换为"direct" /* DIRECT */
【解决方案2】:

declare 关键字表示关联的函数、类等是在别处定义的,TSC 不应为该对象发出任何运行时代码。

我建议将其放置在声明文件 (.d.ts) 以外的某个打字稿文件中并删除 declare 或在 .js 文件中包含某种在运行时使用的等效代码。

【讨论】:

  • 除了.d.ts 之外,typescript 是否还有其他文件可以声明全局变量?
  • @George 如果您需要发出而不是仅仅声明的全局对象,您总是可以创建一个global.ts 文件。
猜你喜欢
  • 2020-01-29
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 2019-03-22
相关资源
最近更新 更多