如何正确映射pdfjs-dist中分离存放的d.ts文件与JS文件?
解决pdfjs-dist类型文件与JS文件的路径映射问题
我来帮你梳理下问题所在,以及可行的解决办法:
首先得说,你之前用paths配置没生效的原因是:TypeScript的paths只负责在类型检查和模块解析阶段找到对应的类型文件,但它不会在编译成JS代码时自动替换这些路径。所以你导入pdfjs-dist/types/src/...后,TS编译出来的require路径就原样保留了,自然找不到实际的JS文件。
下面给你几个实用的解决方案,按推荐程度排序:
方案一:直接导入JS模块路径(最优解)
pdfjs-dist官方已经在package.json里配置了类型映射,你完全不需要手动导入types/src/...路径。直接导入JS文件所在的lib路径即可,TS会自动关联对应的类型定义:
import { NodeCanvasFactory } from 'pdfjs-dist/lib/display/node_utils';
这样编译后生成的JS代码就是你期望的:
const node_utils_1 = require("pdfjs-dist/lib/display/node_utils");
同时TS也能正确找到types/src/display/node_utils.d.ts的类型定义,完美兼顾类型检查和运行时路径正确性。
方案二:用tsconfig-paths处理编译后的路径(适合必须保留原导入方式的场景)
如果你因为某些原因必须保持import ... from 'pdfjs-dist/types/src/...'的导入方式,那需要借助tsconfig-paths工具来替换编译后的路径:
- 先安装依赖:
npm install --save-dev tsconfig-paths
- 保持你原来的
tsconfig.json里的paths配置不变 - 运行编译后的代码时,需要加上
tsconfig-paths/register的钩子:
# 用ts-node直接运行源码 ts-node -r tsconfig-paths/register src/your-entry-file.ts # 或者编译后运行dist目录的代码 node -r tsconfig-paths/register dist/your-entry-file.js
这个方案需要额外的工具支持,不如方案一简洁,但能满足特定场景的需求。
方案三:自定义类型映射(适合官方类型配置有问题的情况)
如果pdfjs-dist的官方类型映射出现异常,你可以在项目里手动创建类型映射文件:
- 在项目根目录创建
typings/pdfjs-dist/index.d.ts文件,内容如下:
declare module 'pdfjs-dist/lib/display/node_utils' { export { NodeCanvasFactory } from 'pdfjs-dist/types/src/display/node_utils'; }
- 在
tsconfig.json的include数组里添加typings/**/*.d.ts,确保TS能识别这个自定义类型文件 - 然后就可以像方案一那样导入
pdfjs-dist/lib/...路径,TS会通过自定义类型文件找到对应的类型定义。
内容的提问来源于stack exchange,提问作者lublak
相关产品推荐
相关产品推荐

