javascript - 如何使用 typescript 定义文件中的枚举?

标签 javascript node.js typescript typescript-typings pdfmake

我正在使用 typescript 在 nodejs 中编程。

我正在使用 pdfmake 我为这个库安装了 typescript 定义文件 (@types/pdfmake)

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/pdfmake/index.d.ts

我正在从该文件中导入枚举之一

从“pdfmake/build/pdfmake”导入 { PageSize };

并像这样使用 PageSize.A4

这可以编译,但是当我尝试访问这个枚举的值 A4 时,发生运行时错误

类型错误:无法读取未定义的属性“A4”

任何帮助将不胜感激

package.json:

{
  "name": "nodejs-pdf-make",
  "version": "1.0.0",
  "description": "",
  "main": "dist/app.js",
  "scripts": {
    "start": "tsc && node --inspect dist/app.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/express": "^4.17.1",
    "tslint": "^5.19.0",
    "typescript": "^3.6.2"
  },
  "dependencies": {
    "@types/pdfmake": "^0.1.8",
    "express": "^4.17.1",
    "pdfmake": "^0.1.58"
  }
}

tsconfig.json:

{
  "compilerOptions": {
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "es6",
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist"
  },
  "lib": ["es2015"]
}```

最佳答案

问题是类型定义只是针对类型。它们不会改变模块的运行时行为。因此,虽然 TypeScript 对您的代码很满意,因为类型定义表明此模块导出一个枚举 PageSize,但在运行代码时这会分崩离析,因为实际上该模块不会导出 PageSize.

我认为这是 @types/pdfmake 中的错误。

这个问题可以在 @types/pdfmake 中通过使枚举 const 来解决:

const enum PageSize {
   // ...
}

TypeScript 自动内联 const 枚举。内联意味着编译器将 PageSize.A4 替换为 'A4',这样就不会在 JavaScript 代码中留下对 PageSize 的引用。

当然,这需要更改 @types/pdfmake。我鼓励您在 DefinitelyTyped repo 上打开拉取请求或问题.


@types/pdfmake 中没有任何更改,您唯一的选择是使用硬编码字符串:

pageSize: 'A4' as PageSize

不幸的是,您甚至可能不得不将其转换为 PageSize 枚举,因为这是类型定义所期望的。

关于javascript - 如何使用 typescript 定义文件中的枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57773414/

相关文章:

javascript - 路线不适用于模块化结构

typescript - 澄清 TypeScript 的 noUnusedParameters 编译器选项

javascript - 添加但未删除 beforeunload 之前的 ReactJS 事件监听器

javascript - 我正在尝试让我的幻灯片放映更改图片 : pressing a button should change the displayed image to the button pressed

javascript - 从使用 Ajax/Javascript 的网站收集数据。 - curl

node.js - 不再能够在 Angular 4.2.3 中导入 BrowserAnimationsModule

node.js - 如何在 TypeScript 中通过索引访问通用对象的属性?

javascript - 我们如何找到尝试连接到其开发人员站点的已下载 jquery 插件?

javascript - 如何修复 Discord.js 中的 "TypeError: message.member.hasPermission is not a function"?

node.js - 使用 eureka-js-client Node 库发现实例