打字稿 d.ts 文件中的枚举

jon*_*bbs 4 enums typescript create-react-app

我是 Typescript 的新手,我在 create-react-project 中使用它。我有一个名为 /typings 的文件夹,我的 tsconfig.json 文件指向它,到目前为止,我已将所有类型声明放在该文件夹中的index.d.ts文件中。

到现在为止还挺好。“类型”和“接口”声明似乎在我的项目的所有部分都可用。我没有明确地从index.d.ts文件中导出它们,也没有将它们导入到任何其他文件中。

当我声明以下内容时,问题就出现了......

enum Gender {male, female}
Run Code Online (Sandbox Code Playgroud)

当我尝试在不同的文件中使用枚举时,出现错误...

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

我已经阅读了关于 SO 的其他答案,其中说您应该将枚举声明为常量,但这无济于事。我还看到建议您应该在文件底部“导出默认未定义”,但是当我这样做时,项目的其余部分中没有其他类型可用。

最后,我尝试更改我的编译器选项以设置"isolatedModules": false但在编译时它会自动切换回 true。显然 create-react-app 总是会这样做。

我应该怎么做才能让我的 index.d.ts 文件中声明的枚举可以自动用于我的项目的其余部分?

Zze*_*Zze 9

枚举不能进入d.ts.

这样做的原因是枚举具有编译输出,而其他.d.ts诸如接口则没有。

例如:

enum Hello{
    One = 'This is one',
    Two = ''
}
Run Code Online (Sandbox Code Playgroud)

编译为:

"use strict";
var Hello;
(function (Hello) {
    Hello["One"] = "This is one";
    Hello["Two"] = "";
})(Hello || (Hello = {}));
Run Code Online (Sandbox Code Playgroud)

而一个接口:

interface Hello {
    test: string;
}
Run Code Online (Sandbox Code Playgroud)

编译为:

// an empty file, as interfaces are only used during pre-compile not in Javascript.
Run Code Online (Sandbox Code Playgroud)

.d.ts文件没有明确地导入到文件中,因此 Typescript 不知道在哪里注入这个文件内容。正如您很可能知道的那样,Javascript 是从上到下编译的,因此将枚举注入到输出 Javascript 中的位置至关重要。

过去,我们将枚举放入common.ts文件和类中,当您需要使用枚举时,我们会导入该文件和类。

  • 谢谢,那么我应该把枚举放在哪里,因为显然我不想在多个地方声明它们。我是否必须创建一个 enums.ts 文件并单独导出它们并导入它们? (3认同)