typescript 编译时内联的类型脚本全局枚举

wgxvkvu9  于 2023-01-21  发布在  TypeScript
关注(0)|答案(3)|浏览(249)

我有一个枚举,几乎在我的项目中的任何地方都要用到它。我不想在每个文件中导入它。有没有办法在.d.ts文件中定义一个枚举,这样它在编译成js时就可以内联了?
在我的types/global.d.ts文件中,我尝试

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

当我运行应用程序时,我在代码中的某个地方遇到了MessageType.DIRECT is not defined错误,我试图使用它。我从来没有导入过这个枚举,因为tslint可以识别它,自动完成也可以工作。
我也试过declare const enum ...,效果一样。
有什么想法吗?

2w2cym1i

2w2cym1i1#

通过使用declare,您已经创建了一个环境枚举,这意味着您正在定义一个现有对象的形状,因此这只是生成类型,而不是一个实际的对象。
如果删除declare,它将创建枚举的类型和对象
https://www.typescriptlang.org/docs/handbook/enums.html具有关于环境枚举的更多详细信息

ghhkc1vu

ghhkc1vu2#

declare关键字表示相关函数、类等在别处定义,TSC不应为该对象发出任何运行时代码。
我建议将其放在某个类型脚本文件中,而不是声明文件(.d.ts)中,并删除declare,或者在.js文件中包含某种在运行时使用的等效代码。

d4so4syb

d4so4syb3#

遇到了同样的问题。将枚举定义为常量。为了解决这个问题,我定义了一个constants.ts文件,将enums存储为常量以防止修改。例如,在您的情况下:

// constants.ts
export const DIRECT = 'direct'
export const FORWARD = 'forward'

// main.ts
import { DIRECT, FORWARD } from 'constants.ts'
// ... use DIRECT or FORWARD accordingly

如果您在类型定义中使用enum,请考虑避免使用enum,而直接指定值,例如:

// types.d.ts
interface User {

    name: string
    role: 'USER' | 'ADMIN' // instead of using enum, define the values that the field can take on

}

相关问题