我正在构建一个依赖 PDFKit 的 Web 应用程序。 PDFKit 可以使用 Webpack 在浏览器中运行。由于我将 Typescript 与 Webpack 一起使用,因此我将 @types/node 包含在内定义,以便我与 PDFKit 的接口(interface)正常工作。
这会导致应用程序的其他部分使用浏览器全局变量(例如 Timer)或 Webpack 运行时全局变量(例如 require),其中类型与 Node 不同而引发错误。
有没有人有一个干净的方法来将 Node 类型隔离到需要的文件中?过去我已经根据需要分散了任何
- 例如:
(require as any).ensure(...); // require has no method 'ensure' in Node
let tmr: number = setTimeout(...) as any; // returns a 'Timer' in Node
这实在是丑陋且不可持续。有更好的办法吗?
最佳答案
作为解决方法,您可以禁用 require
从 Node 输入。
在 tsconfig.json
中显式设置 typeRoots
。在这种情况下,@types
文件夹将不再用于查找类型。在自定义类型根中,您可以创建 index.d.ts 文件,其中///引用 @types 中的typyngs(node.d.ts 除外)。您还可以在自定义类型根目录中提供经过修改的自定义版本的 node.d.ts。
不是最佳解决方案。缺点很明显:您必须以某种方式维护引用和 Node 类型的自定义版本:)
(有关 typeRoots 的信息,请参阅 http://www.typescriptlang.org/docs/handbook/tsconfig-json.html )
更新:
在这里找到了另一个答案: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/11324#issuecomment-265046822
您可以为每组文件创建单独的 tsconfig.json 文件,使用 Node 和不使用 Node 。您可以在此处明确选择要在组中应用的类型。 您仍然需要维护一组输入名称,但它要小得多。
关于node.js - 解决 Webpack + Typescript 中与 Node 依赖库的类型冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45023346/