从typescript类型定义文件导出枚举

时间:2018-05-28 10:54:52

标签: typescript typescript-typings

我正在编写我正在使用的库的类型定义。库中的一个函数标识由整数单击的鼠标按钮:

 //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模块。

3 个答案:

答案 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做了什么,请参阅MouseKey @types/jquery/index.d.ts。它很方便,因为标准枚举在JavaScript中编译为数组,而const enum成员直接编译为值;见TypeScript Playground