typescript - Three.js Object3D 缺少 isMesh、Material 和 Geometry 属性?

标签 typescript three.js

我使用的是 Three.js r97 和 Angular 7。

我可以在本地运行和提供应用程序(按原样工作),但我无法为具有类型错误的生产构建。

error TS2339: Property 'isMesh' does not exist on type 'Object3D'.

error TS2339: Property 'material' does not exist on type 'Object3D'.

error TS2339: Property 'geometry' does not exist on type 'Object3D'.



发生这种情况的地方是在加载对象之后我正在遍历零件。
child.isMesh并且对子对象所做的修改会引发错误。

我是 typescript 的新手,不确定是否有更好的方法来处理这些操作。据我所知,我无法强制进行生产构建。任何有助于解决此问题的建议将不胜感激。
this.loader = new THREE.FBXLoader();
      this.loader.load('assets/models/C4D_Export.fbx', object => {

          object.traverse( child => {

              if( child.type == "Group"){
                  child.name = 'ToolGroup';
              }
              if ( child.isMesh ) {

                  const oldMat = child.material;
                  //CONVERT MATERIAL TO STANDARD MATERIAL.
                  child.material = new THREE.MeshStandardMaterial({
                      color: oldMat.color,
                      map: oldMat.map,
                  });

                  child.castShadow = true;
                  child.receiveShadow = true;
                  child.material.combine = THREE.MixOperation;
                  child.material.envMap = envMap;
                  child.material.shininess=10;
                  child.material.refractionRatio=1;
                  child.material.reflectivity=1;
                  //child.material.normalMap = texture;
                  //child.material.normalMapType = 0;
                  child.material.metalness=1;
                  child.geometry.applyMatrix(new THREE.Matrix4().makeTranslation(5, 0, 0));
                  //child.material.color.setHex( 0xffffff );

                  var f2 = gui.addFolder('Position'+child.name);
                      f2.add(controller, 'positionX', -50, 50).onChange( function() {
                         child.position.x = (controller.positionX);
                      });
                      f2.add(controller, 'positionY', -50, 50).onChange( function() {
                         child.position.y = (controller.positionY);
                      });
                      f2.add(controller, 'positionZ', -50, 50).onChange( function() {
                         child.position.z = (controller.positionZ);
                      });

                  var sphereAxis = new THREE.AxesHelper(200);
                  child.add(sphereAxis);

              }

          });

          object.position.y = -20;
          object.scale.set(1,1,1);
          object.rotation.z = (-90*(Math.PI/180));
          objholder.add(object);


      });

我尝试为 Object3D 添加一个接口(interface)并定义如下属性:
interface Object3D{
    isMesh?: any,
    geometry?: any,
    material?: any,
}

错误仍然存​​在。

编辑:更新 2

我可以通过提供 //@ts-ignore 来解决这个问题在导致问题的每一行之上。我不确定这是否是不好的做法,但它似乎有效。

最佳答案

看起来您的 TypeScript 开发配置与您的生产配置不同。没有其他原因会在构建时出现错误,但在本地开发环境中编译时不会。 (顺便说一下,您看到的错误是正确的,因为 child 预计是 Object3D ,它没有 .isMesh 属性。)

而不是做 //@ts-ignore ,你可以断言 child 的类型达到您的期望:

if ( child.isMesh ) // Error: property .isMesh does not exist in Object3D

if ( (<any> child).isMesh ) // No error, but there's no type-checking with <any>

if ( (<THREE.Mesh> child).isMesh ) // No error, and you get access to Mesh props

您可以了解更多 type assertions in the TS documentation

关于typescript - Three.js Object3D 缺少 isMesh、Material 和 Geometry 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53230986/

相关文章:

javascript - 我们可以动态地将自定义着色器应用于 Three.js 对象吗

javascript - 多个 Canvas 和 JSON 加载几何图形时出现 Three.js 错误

javascript - "TS2339: Property ... does not exist on type ...", 在输入字段

javascript - 链接函数没有被调用

javascript - SolidJS - 如何获取当前组件实例

javascript - 计算物体适合屏幕高度所需的相机变焦

three.js - ThreeJS - THREE.BufferGeometry.computeBoundingSphere() 给出错误 : NaN Position Values

javascript - 由于相机位置,无法在场景中显示三个.js 元素

javascript - Moment-with-locales 和 TypeScript

javascript - 如何停止循环数组的方法?