如何在typescript中使用html pdf节点



我需要在节点中使用这个包,我使用的是typescript。

文档中的示例代码显示如下:

var html_to_pdf = require('html-pdf-node');
let options = { format: 'A4' };
// Example of options with args //
// let options = { format: 'A4', args: ['--no-sandbox', '--disable-setuid-sandbox'] };
let file = { content: "<h1>Welcome to html-pdf-node</h1>" };
// or //
let file = { url: "https://example.com" };
html_to_pdf.generatePdf(file, options).then(pdfBuffer => {
console.log("PDF Buffer:-", pdfBuffer);
});

但是,我怎么能在typescript上下文中使用它呢?

您的库不支持typescript,也没有@types/html-pdf-node包,因此您必须自己创建所谓的声明文件。

声明文件的名称应该类似于html-pdf-node.d.ts,其内容应该以开头

declare module "html-pdf-node"{
}

现在,在您声明库导出的函数的模块中,让我们取您的generatePdf函数,看看如何声明它,首先很明显,它需要两个参数并返回一个promise,所以我们从以下内容开始:

declare module "html-pdf-node"{
export function generatePdf(file: IFile,options: IOptions) => Promise<Buffer>;
}

所以generatePdf有两个参数,第一个是类型IFile,我们稍后将在上面的同一模块中定义它,IOptions也是如此,函数返回Promise<Buffer>,其中Buffer是NodeJS的Buffer

现在定义IFile接口如下:

declare module "html-pdf-node"{
interface IFile{
content: string;
}
export function generatePdf(file: IFile,options: IOptions) => Promise<Buffer>;
}

你用同样的方式定义IOptions,Voilà!您的库现在是类型安全的,文件html-pdf-node.d.ts应该放在根项目目录中的@types文件夹中。

但是等等,IFile支持content以外的选项?!!你只定义了你需要使用的东西,而不是库支持的所有东西,所以你需要使用其他选项吗?只是更改了IFile,新版本的库是否将generatePdf更改为接受三个参数而不接受两个参数?只需在html-pdf-node.d.ts中更改其类型即可。

不管怎样,我把所有这些都放在这里,让你学习如何处理一个在社区中没有定义任何打字法的强制库,对于你的情况,更好的方法是切换到另一个维护的库,它可能内置了typescript,或者至少有@types/some-library包。

按照tsconfig.json

结构项目

{
"compilerOptions": {
"allowJs": true,
"module": "CommonJS",
"noImplicitReturns": true,
"noUnusedLocals": true,
"outDir": "lib",
"sourceMap": true,
"strict": true,
"target": "es2021",
"resolveJsonModule": true,
"lib": ["es6"],
"forceConsistentCasingInFileNames": true,
"removeComments": true,
"rootDirs": ["./src", "./tests"],
"skipLibCheck": true,
"typeRoots": [
"./node_modules/@types",
"./src/@types"
],
"esModuleInterop": true,
"baseUrl": ".",
"paths": {
"@components/*": ["./src/components/*"],
"@configurations/*": ["./src/configurations/*"],
"@controllers/*": ["./src/controllers/*"],
"@entities/*": ["./src/entities/*"],
"@helpers/*": ["./src/helpers/*"],
"@repositories/*": ["./src/repositories/*"],
"@services/*": ["./src/services/*"],
"@utils/*": ["./src/utils/*"]
}
},
"typeAcquisition": {
"include": [
"jest"
]
},
"compileOnSave": true,
"include": [
"src",
"tests"
],
"exclude": [
"lib",
"node_modules"
]
}

最新更新