为什么用`isolatedModules`允许`const enum`?

时间:2019-07-02 14:43:21

标签: typescript

declare const enum {
    UP,
    DOWN,
}`
当使用--isolatedModules编译器选项时,

是不允许的。

error TS1209: Ambient const enums are not allowed when the '--isolatedModules' flag is provided.

我对--isolatedModules的理解是,它告诉编译器进行额外的检查,以确保单独的编译(例如,通过使用transpileModule)是安全的。

那么为什么允许const enum(没有declare)?单独编译是否不安全?也就是说,如果foo.tsconst enum导入并使用bar.tsts.transpileModule怎么知道如何正确地转换枚举用法?

1 个答案:

答案 0 :(得分:1)

如果您正在使用其他编译器来编译代码,例如babel,则该编译器只能与在同一模块文件中声明的打字稿一起使用。如果您在使用它的同一模块中声明常量枚举,那么这不是问题。当您想将枚举公开给其他模块时,问题就开始了。

例如,如果您正在编写枚举:

const enum Animal {
  DOG,
  CAT
}

到目前为止,如果仅在声明它的SAME源文件中使用此代码,就没有问题了:

Animal.DOG // Will be replaced with 0.

但是要在另一个源文件中使用Animal.DOG的图像。使用Transpiler编译是在隔离模块的基础上进行的:

  • 编译器读取一个打字稿模块。
  • 该模块的类型信息已删除。
  • 剩下的就是编译器编写的JavaScript模块。

因此,如果未在同一模块上声明动物,则不可能知道Animal.DOG。这就是为什么该标志首先被称为--isolatedModules的原因。此标志正在检查并报告在这种情况下无法使用的任何打字稿使用情况。

如果您正在编写库,则不要导出const枚举,因为如果用户使用babel而不是tsc来编译代码,则用户将无法使用它们。