我正在编写我正在使用的库的类型定义。库中的一个函数标识由整数单击的鼠标按钮:
//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
仍然可以编译,但不会运行。
有没有办法通过MouseButton
语句导入的myLib
导入和引用import * as myLib
枚举?我不仅要找一个解释如何解决这个问题的答案,而且要解释为什么我的解决方案不起作用或为什么不可能。资源提示解释了哪些错误也值得赞赏
PS:我也尝试了re-export Typescript enum from namespace?建议的语法,但这也没有用。
PPS:有问题的模块是角度6项目中使用的基石项目(https://github.com/cornerstonejs/cornerstone)中的UMD模块。
答案 0 :(得分:5)
从我对该主题的简短研究中,我注意到使用export enum const
从类型定义文件中导出枚举是一个坏主意。由于您必须启用--isolatedModules
旗标,而这在说create-react-app
中是不可能的,它会变得混乱。
相反,我本人在shared.d.ts
文件中使用了常规语法:
export enum EReviewStatus {
PENDING = 'PENDING',
SENT = 'SENT'
}
然后我有一个.js
文件,该文件被导入到package.json
主块中,例如:
"main": "shared.js",
我在哪里(使用CommonJS导出使其在Node.js和前端中都兼容):
module.exports.EReviewStatus = {
PENDING: 'PENDING',
SENT: 'SENT'
}
哪种方法有效,我认为更好的做法是,因为现在您的代码已与类型明确分开。
答案 1 :(得分:3)
在上面Romain Denau's comment的帮助下解决了这个问题。它向我推动了正确的方向:打字稿编译器从枚举中生成了什么代码(参见https://www.typescriptlang.org/docs/handbook/enums.html#enums-at-runtime)?声明枚举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;
答案 2 :(得分:2)
(完成t.animal自己的回答)
难以宣传声明文件:请参阅长documentation。有时查看现有的.d.ts文件可能有所帮助。
关于enum
,将它们声明为const enum
是一种简洁明了的方法。它的
例如,为jquery做了什么,请参阅Mouse
和Key
@types/jquery/index.d.ts。它很方便,因为标准枚举在JavaScript中编译为数组,而const enum
成员直接编译为值;见TypeScript Playground。