使用 forge-viewer/node_modules/@types/three 中的 THREE 会导致编译器错误

Posted

技术标签:

【中文标题】使用 forge-viewer/node_modules/@types/three 中的 THREE 会导致编译器错误【英文标题】:Using THREE from forge-viewer/node_modules/@types/three causes compiler error 【发布时间】:2020-10-10 00:59:34 【问题描述】:

我需要使用需要THREE.Vector4 类型参数的Viewer.setThemingColor() 方法。

我正在使用 Angular 9,并且我已经安装了 @types/forge-viewer,其中还包括在 forge-viewer/node_modules/@types/three 处的三个定义。

Visual Studio Code 获取THREE.Vector4 的定义并插入import * as THREE from 'forge-viewer/node_modules/@types/three',但ng build 命令抛出错误:

Can't resolve 'forge-viewer/node_modules/@types/three'.

我尝试在许多变体中为tsconfig.app.json(类型)和tsconfig.json(类型根)添加三个,但这没有帮助。

额外安装 @types/three 并从“三”导入将修复编译器错误,但它会在不同位置创建重复定义,并且 Visual Studio Code 只会自动查看来自 forge-viewer forge-viewer/node_modules/@types/three 而不是 three 的位置。

她有什么问题以及如何解决?

【问题讨论】:

在安装@types/three 时有一个额外的副作用:在浏览器中加载了两个不同的three.js 副本:一个由 Forge 脚本加载,另一个从 webpack 加载。当尝试使用三种类型时,这种情况会在代码中产生实际问题。 Bryan Huang你能看看这个吗? 您确定安装@types/three 也会安装实际的three.js 库吗?这似乎很奇怪。 在不太了解Angular 9及其构建系统的情况下,大致情况是这样的:Forge Viewer包含了three.js(版本R71),通过THREE全局变量自动获取库.所以这里的目标是以某种方式说服 Angular 假设在包含三个.js 库 R71 的全局范围内总会有一个 THREE 对象。 @PetrBroz 我认为该软件包已安装,因为编译后它已从 webpack 加载到浏览器中。在 Chrome 调试器中可以看到这三个.js 版本的源代码以及随 viewer.js 提供的另一个副本。 【参考方案1】:

我找到了一种方法来避免在代码中引用 THREE 对象而不安装 @types/three 时出现编译器错误。在引用形式 THREE 的 TS 文件中,例如 THREE.Vector4,而不是从模块中导入 THREE,而是插入“假”声明

declare var THREE: any;

积极的结果是:

    没有编译错误; 没有从 webpack 加载的 three.js 的第二个副本

负面结果是在 VS Code 中丢失 TypeScript 智能感知,但可以通过临时安装 @types/three、开发和测试代码然后删除 @types/three 来缓解这种情况。

【讨论】:

以上是关于使用 forge-viewer/node_modules/@types/three 中的 THREE 会导致编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)