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

Max*_*ber 7 typescript

declare const enum {
    UP,
    DOWN,
}`
Run Code Online (Sandbox Code Playgroud)

--isolatedModules使用 compilerOption时不允许。

error TS1209: Ambient const enums are not allowed when the '--isolatedModules' flag is provided.
Run Code Online (Sandbox Code Playgroud)

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

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

Ziv*_*ber 21

如果您使用其他转译器来编译代码,例如 babel,那么该转译器只能使用同一模块文件中声明的 typescript。如果您在使用它的同一模块中声明 const 枚举,那么这不是问题。当您想要将枚举公开给其他模块时,问题就开始了。

\n

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

\n
const enum Animal {\n  DOG,\n  CAT\n}\n
Run Code Online (Sandbox Code Playgroud)\n

到目前为止,如果您只是在声明它的同一源文件中使用此代码,那么这不是问题:

\n
Animal.DOG // Will be replaced with 0.\n
Run Code Online (Sandbox Code Playgroud)\n

但想象一下您想在另一个源文件中使用 Animal.DOG。转译器编译是在独立模块的基础上进行的:

\n
    \n
  • 编译器读取打字稿模块。
  • \n
  • module\xe2\x80\x99s 类型信息被删除。
  • \n
  • 剩下的\xe2\x80\x99就是编译器编写的JavaScript模块。
  • \n
\n

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

\n

如果您正在编写一个库,那么不要导出 const enum,因为如果您的用户使用 babel 而不是 tsc 来编译代码,他们将无法使用它们。

\n

  • 这个答案太棒了,让我找到了这篇文章,它更深入地解释了这个(令人沮丧的)问题:https://ncjamieson.com/dont-export-const-enums/ (6认同)