从typescript类型定义文件导出枚举
我正在为我正在使用的库编写类型定义。库中的一个函数标识整数单击的鼠标按钮:从typescript类型定义文件导出枚举,typescript,typescript-typings,Typescript,Typescript Typings,我正在为我正在使用的库编写类型定义。库中的一个函数标识整数单击的鼠标按钮: //index.d.ts 导出为名称空间myLib; //激活库以侦听特定的鼠标按钮 功能激活(按钮:编号):无效 我引入了一个enum,使它变得更好: //index.d.ts 导出为名称空间myLib; 导出枚举鼠标按钮{ 左=1, 中间=2, 右=4 } 导出功能激活(按钮:鼠标按钮):无效; 现在,当我导入这个函数并使用它时,所有的东西都会编译,但我猜当在浏览器中执行时,枚举会被剥离和未定义。错误消息显示无法
//index.d.ts
导出为名称空间myLib;
//激活库以侦听特定的鼠标按钮
功能激活(按钮:编号):无效
我引入了一个enum,使它变得更好:
//index.d.ts
导出为名称空间myLib;
导出枚举鼠标按钮{
左=1,
中间=2,
右=4
}
导出功能激活(按钮:鼠标按钮):无效;
现在,当我导入这个函数并使用它时,所有的东西都会编译,但我猜当在浏览器中执行时,枚举会被剥离和未定义。错误消息显示无法读取未定义的属性“LEFT”
因此,我重新排列了文件,如下所示:
//MouseButton.ts
导出枚举鼠标按钮{
左=1,
中间=2,
右=4
}
//索引d.ts
导出为名称空间myLib;
从鼠标按钮导入{MouseButton};
从鼠标按钮导出{MouseButton};
导出功能激活(按钮:鼠标按钮):无效;
现在我可以从“myLib/MouseButton”导入{MouseButton};从“myLib”导入*作为myLib
。但这需要两种进口。引用myLib.MouseButton
仍会编译,但不会运行
有没有办法通过myLib
作为myLib语句导入和引用MouseButton
枚举?我不仅在寻找一个解释如何做到这一点的答案,也在寻找一个解释为什么我的解决方案不起作用或为什么它不可能的答案。同时,我们也非常感谢对资源的提示,以解释问题所在
PS:我也尝试了这里建议的语法,但也不起作用
PPS:所讨论的模块是angular 6项目中使用的基石项目()中的UMD模块。通过上面的帮助解决了这个问题。它把我推向了正确的方向:typescript编译器从枚举生成什么代码(请参阅)?声明enum
const
允许typescript编译器将标识符与相应的值完全交换,从而有效地将其内联。枚举不再泄漏到生产代码中。谢谢
//index.d.ts
export as namespace myLib;
export const enum MouseButton {
LEFT = 1,
MIDDLE = 2,
RIGHT = 4
}
export function activate(button : MouseButton ) : void;
(完成t.animal自己的回答)
声明文件很难创建:请参阅详细信息。有时查看现有的.d.ts文件会有所帮助
关于enum
,将它们声明为const enum
是一种干净而简单的方法。它是
例如,对于jquery,请参见有关
鼠标
和键
的信息。它很方便,因为标准枚举在JavaScript中编译为数组,而const enum
成员直接编译为值;请参阅。从我对该主题的简短研究中,我注意到使用export enum const
从类型定义文件导出枚举是个坏主意。由于您必须启用--isolatedModules
标志,这在saycreate react app
中甚至不可能实现,因此它可能会变得混乱
相反,我自己在shared.d.ts
文件中使用了正常语法:
export enum EReviewStatus {
PENDING = 'PENDING',
SENT = 'SENT'
}
然后我有一个.js
文件,它被导入到包.json
主块中,例如:
"main": "shared.js",
我有(使用CommonJS导出使其在Node.js和frontend中兼容):
哪一种方法有效,我认为是更好的实践,因为现在您的代码已与类型明确分开。发生错误
无法读取未定义的属性“LEFT”的源代码是什么?此代码是角度项目的一部分(很抱歉没有提及)。错误消息会在执行浏览器的控制台中抛出。是否使用枚举鼠标按钮作为反向映射:鼠标按钮[按钮]
?如果不是,我不知道为什么这个纯类型脚本的东西会泄漏到JavaScript中,除非模块中出现了JaveScript包问题。也许,这是一个与类型定义语法相关的问题。这取决于JavaScript库的类型:什么样的模块:UMD?纯ES6。。。尝试寻找一个类似的库,从它的定义文件中获得灵感。如果没有这个库及其用法(即更多的代码),就很难解释这个问题。我对MouseButton的用法如下:myLib.activate(MouseButton.LEFT)代码>(具有两个导入版本)。但我希望它是myLib.activate(myLib.MouseButton.LEFT)`。你说的“泄漏”是什么意思?它应该被编译掉并替换为枚举值吗?如何重新导出它?@Jose:我不明白你的问题。也许它应该有自己的完整堆栈溢出问题。我没有得到shared.js文件部分。你能更准确地说明你做了什么吗?我的情况是无法禁用——isolatedModules
,您的解决方案将保存我的life@Devz所以我有两个文件:shared.d.ts和shared.js(名称是任意的)。它们是使用“类型”:“shared.d.ts”和“main”:“shared.js”从package.json导入的。我不知道还能怎么解释。我更新了我的解决方案以使用CommonJS,因为没有它我无法从Node.js后端导入js(我不想编译它)。是的,尝试使用path、composite和references的效果不如此选项。这不是干巴巴的。要使其干燥,您可以使用一个shared.ts
并从中生成.js
和.d.ts
。或者将整个项目写成TS。“typescript编译器从枚举定义生成什么代码?”-这是。
module.exports.EReviewStatus = {
PENDING: 'PENDING',
SENT: 'SENT'
}