【发布时间】:2018-11-06 22:51:03
【问题描述】:
我正在为我正在使用的库编写类型定义。库中的一个函数标识了一个整数单击的鼠标按钮:
//index.d.ts
export as namespace myLib;
// activates the library listening for a specific mouse button
function activate(button : number ) : void
我引入了一个枚举来使它更好:
//index.d.ts
export as namespace myLib;
export enum MouseButton {
LEFT = 1,
MIDDLE = 2,
RIGHT = 4
}
export function activate(button : MouseButton ) : void;
现在,当我导入这个函数并使用它时,一切都会编译,但我猜想枚举在浏览器中执行时会被剥离和未定义。错误消息显示Cannot read property 'LEFT' of undefined。
因此我像这样重新排列文件:
//MouseButton.ts
export enum MouseButton {
LEFT = 1,
MIDDLE = 2,
RIGHT = 4
}
//index.d.ts
export as namespace myLib;
import {MouseButton} from MouseButton;
export {MouseButton} from MouseButton;
export function activate(button : MouseButton ) : void;
现在我可以import {MouseButton} from "myLib/MouseButton"; import * as myLib from "myLib"。但这需要两次导入。引用 myLib.MouseButton 仍然可以编译但不会运行。
有没有办法通过myLib 导入和引用MouseButton 枚举,通过import * as myLib 语句导入?我不仅在寻找解释如何做的答案,而且在寻找解释为什么我的解决方案不起作用或为什么不可能的答案。对解释问题所在的资源提示也表示赞赏
PS:我也尝试了这里建议的语法re-export Typescript enum from namespace?,但这也没有用。
PPS:有问题的模块是 Angular 6 项目中使用的基石项目 (https://github.com/cornerstonejs/cornerstone) 中的 UMD 模块。
【问题讨论】:
-
发生错误
Cannot read property 'LEFT' of undefined的源代码是什么? -
此代码是 Angular 项目的一部分(抱歉没有提及)。在执行浏览器的控制台中抛出错误信息。
-
您是否使用枚举
MouseButton作为反向映射:MouseButton[button]?如果没有,我不知道为什么这个纯 TypeScript 的东西会泄漏到 JavaScript,除非模块的 JaveScript 捆绑问题。 -
可能是类型定义语法的问题。这取决于 JavaScript 库的类型:什么样的模块:UMD?纯ES6? ...尝试找到一个类似的库以从其定义文件中获得灵感。如果没有这个库和它的用法(即更多的代码),就很难解释这个问题。
-
不。我对 MouseButton 的使用如下:
myLib.activate(MouseButton.LEFT);(带有两个导入版本)。但我希望它是 myLib.activate(myLib.MouseButton.LEFT)`。 “泄漏”是什么意思?是否应该将其编译掉并替换为枚举值?
标签: typescript typescript-typings