我有一个使用d3库的应用程序。在typescript代码中,为了成功地使用d3 (即没有编译器错误的情况下,d3引用了一个UMD全局变量,但当前文件是一个模块),我必须包括一行:import * as d3 from 'd3'; Problem with that is TS2686:require('d3'); In JavaScript。这不是我们应用程序中的d3库所在的位置。它位于web应用的根目录下,名为'd3‘的目录中。此外,我根本不需要在JavaScript中使用它,因为我们的index.html将它作为全局变量加载。我很难弄清楚如何获得TypeScript源代码,以便在不导入的情况下引用d3。
发布于 2018-01-18 01:37:06
您有两种可能的选择:
禁止显示警告
从TypeScript 3.5 a --allowUmdGlobalAccess flag was added开始,允许您从模块文件访问全局定义。在您的例子中,这意味着您可以在没有import或require语句的情况下使用require作为全局名称空间。这显然将适用于项目中的所有模块文件和任何其他UMD类型定义(例如,像React ),因此请注意,它可能在所有上下文中都不正确,这取决于您的代码设置和所使用的库。
声明全局命名空间
在TS3.5之前的版本中,在模块文件中没有--allowUmdGlobalAccess标志UMD typedefs can't be referenced as a global namespace。(它只允许您引用非模块文件中的全局名称空间。)这是一种有意的安全措施,可防止意外引用严格基于模块的项目中不可用的全局命名空间。workaround将在项目中手动声明一个全局名称空间:
// global.d.ts
import * as _d3 from "d3";
declare global {
const d3: typeof _d3;
}现在,您可以从模块引用d3,而无需从"d3"导入,并且仍然可以基于@types/d3对d3对象进行所有正确的类型检查。
与--allowUmdGlobalAccess相比,它的优势在于它非常明确地描述了您的特定代码设置。换句话说,它不会无意中让您编译代码设置没有全局提供的其他UMD模块。
https://stackoverflow.com/questions/48305957
复制相似问题