从打字稿类型定义文件导出枚举

t.a*_*mal 22 typescript typescript-typings

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

 //index.d.ts
 export as namespace myLib;
 // activates the library listening for a specific mouse button
 function activate(button : number ) : void 
Run Code Online (Sandbox Code Playgroud)

我引入了一个枚举来使它更好:

//index.d.ts
export as namespace myLib;
export enum MouseButton {
    LEFT = 1,
    MIDDLE = 2,
    RIGHT = 4
}

export function activate(button : MouseButton ) : void;
Run Code Online (Sandbox Code Playgroud)

现在,当我导入这个函数并使用它时,一切都会编译,但我猜枚举在浏览器中执行时被剥离和未定义。错误消息说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;
Run Code Online (Sandbox Code Playgroud)

现在我可以了import {MouseButton} from "myLib/MouseButton"; import * as myLib from "myLib"。但这需要两次导入。引用myLib.MouseButton仍然编译但不运行。

有没有办法通过语句导入和引用MouseButton枚举?我不仅在寻找解释如何做的答案,而且在寻找解释为什么我的解决方案不起作用或为什么不可能的答案。对解释错误的资源的提示也表示赞赏myLibimport * as myLib

PS:我也尝试过这里建议的语法从命名空间重新导出 Typescript 枚举?但这也不起作用。

PPS:有问题的模块是来自基石项目 ( https://github.com/cornerstonejs/cornerstone )的 UMD 模块,用于 angular 6 项目。

Rom*_*eau 16

(完成t.animal自己的回答)

声明文件很难制作:请参阅长文档。有时查看现有的 .d.ts 文件会有所帮助。

关于enum,将它们声明为const enum一种干净简单的方法。例如,这是为 jquery 所做的,参见@types/jquery/index.d.ts for Mouseand Key。这很方便,因为标准枚举在 JavaScript 中编译为数组,而const enum成员则直接编译为值;参见TypeScript Playground

  • 如何再出口? (11认同)

t.a*_*mal 15

Romain Denau上面的评论的帮助下解决了这个问题。它把我推向了正确的方向:打字稿编译器从枚举生成什么代码(参见https://www.typescriptlang.org/docs/handbook/enums.html#enums-at-runtime)?声明枚举const允许打字稿编译器将标识符与相应的值完全交换,有效地内联它。枚举不再泄漏到生产代码中。谢谢!

//index.d.ts
export as namespace myLib;

export const enum MouseButton {
    LEFT = 1,
    MIDDLE = 2,
    RIGHT = 4
}

export function activate(button : MouseButton ) : void;
Run Code Online (Sandbox Code Playgroud)

  • “打字稿编译器从枚举定义生成什么代码?” - 这。 (2认同)

Tee*_*muK 5

从我对该主题的简短研究中,我注意到从类型定义文件中导出枚举export enum const是一个坏主意。由于您必须启用--isolatedModules甚至不可能的标志,create-react-app并且它可能会变得混乱。

相反,我自己在我的shared.d.ts文件中使用了普通语法:

  export enum EReviewStatus {
    PENDING = 'PENDING',
    SENT = 'SENT'
  }
Run Code Online (Sandbox Code Playgroud)

然后我有一个.js文件,它被导入到package.json主块中,例如:

"main": "shared.js",
Run Code Online (Sandbox Code Playgroud)

我在哪里(使用 CommonJS 导出使其在 Node.js 和前端兼容):

module.exports.EReviewStatus = {
  PENDING: 'PENDING',
  SENT: 'SENT'
}
Run Code Online (Sandbox Code Playgroud)

哪个有效,我认为是更好的做法,因为现在您的代码与类型明显分离。