我有一个使用 d3 库的应用程序。在打字稿代码中,为了成功使用 d3 (即,没有编译器错误 TS2686,d3 引用 UMD 全局,但当前文件是模块),我必须包含以下行:import * as d3 from 'd3';
问题是它会发出:require('d3');
在 JavaScript 中。这不是我们应用程序中 d3 库所在的位置。它位于 Web 应用程序的根目录下名为“d3”的目录中。另外,我在 JavaScript 中根本不需要它,因为我们的 index.html 将其作为全局加载。
很难弄清楚如何获取 TypeScript 源以允许我在不导入的情况下引用 d3。
您有两种可能的选择:
抑制警告
As of TypeScript 3.5a--allowUmdGlobalAccess标志已添加 https://www.typescriptlang.org/docs/handbook/release-notes/overview.html#the---allowumdglobalaccess-flag允许您从模块文件访问全局定义。在你的情况下,这意味着你可以使用d3
作为全局命名空间,无需import
or require
陈述。这显然适用于项目中的所有模块文件以及任何其他 UMD 类型定义(例如 React),因此请注意,它可能并不在所有上下文中都是正确的,具体取决于您的代码设置和使用的库。
声明一个全局命名空间
TS 3.5 之前且没有--allowUmdGlobalAccess
flag UMD typedef 不能作为全局命名空间引用 https://github.com/Microsoft/TypeScript/issues/10178来自模块文件内。 (它只允许您从非模块文件引用全局命名空间。)这是一种有意的安全措施,防止意外引用在严格基于模块的项目中不可用的全局命名空间。这解决方法 https://github.com/Microsoft/TypeScript/issues/10178#issuecomment-263787616是在项目中手动声明一个全局命名空间:
// global.d.ts
import * as _d3 from "d3";
declare global {
const d3: typeof _d3;
}
现在你可以参考d3
来自模块而不导入自"d3"
,并且您仍然应该对d3
对象基于@types/d3
.
这比--allowUmdGlobalAccess
因为它对您的特定代码设置非常明确。换句话说,它不会无意中让您编译代码设置未全局提供的其他 UMD 模块。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)