【问题标题】:Cannot set userData property of threejs MeshBasicMaterial instance无法设置threejs MeshBasicMaterial 实例的userData 属性
【发布时间】:2020-11-05 04:08:03
【问题描述】:

我在实例化时尝试设置 MeshBasicMaterial 实例的 userData 属性时遇到 TypeScript 错误。

例如:

import * as THREE from 'three';
...
const customUserData = {
  ...
};
const myMaterial = new THREE.MeshBasicMaterial({
  color: 0xf7f7f7, 
  transparent: true, 
  opacity: 1, 
  side: THREE.BackSide,
  userData: myCustomUserData
});

这会返回以下错误:

Argument of type '{ color: number; transparent: true; opacity: number; side: THREE.Side; userData: null; }' is not assignable to parameter of type 'MeshBasicMaterialParameters'.
  Object literal may only specify known properties, and 'userData' does not exist in type 'MeshBasicMaterialParameters'.  TS2345

但是,当我调查MeshBasicMaterial 的类型定义时,它扩展了Material

export class MeshBasicMaterial extends Material { ... }

Material 类又指定了一个userData 属性:

export class Material extends EventDispatcher {
    // ...
    userData: any;
    // ...
}

但是,在类实例化之外指定 userData 属性是可行的:

let myMaterial = new THREE.MeshBasicMaterial({...});
myMaterial.userData = myCustomUserData;

MeshBasicMaterial 不应该从Material 继承userData 属性,还是我错过了一些明显的东西? (这可能与MeshBasicMaterialParameters 类型有关,但不清楚为什么使用此类型或阻止从Material 继承属性。)

【问题讨论】:

  • myCustomUserData 的值是多少?
  • 这只是一些对我有用的键值对,但要回答你的问题,我在这里输入的任何内容都会失败:错误似乎来自在实例化时在材料属性中指定 userData .

标签: typescript three.js


【解决方案1】:

您似乎发现了一个缺失的类型定义!

您是对的,当查看 Material 类定义文件时,it has a .userData property。这意味着将其设置为 material.userData = xxx; 应该可以正常工作。

但是,当使用new THREE.Material(props); 启动材料时,您传递的props 参数使用类似但不同的结构,在接口MaterialParameters 中声明,如果you look at what that includes on line 16,则缺少userData

同样的错误适用于MeshBasicMaterialParameters,因为它扩展了MaterialParameters

作为一个快速的解决方案,我建议您将其设置为 material.userData = xxx;,并提交一个 Github 问题,以便在未来的版本中修复它。作为更复杂的解决方案,您可以创建自己的声明文件and do a Merge,并使用MaterialParameters 接口包含.userData

【讨论】:

  • 如果你确实打开了一个 GitHub 问题,请将链接发给我,我可以在下一个版本中快速修复它。
  • 嘿,非常感谢。只是不确定我是否错过了一些关于我如何使用它的东西。这是我提交的问题的链接:github.com/mrdoob/three.js/issues/20621
  • (恐怕我现在还不能给你赏金,但是当时间窗口打开时我会这样做的。)
猜你喜欢
  • 2023-04-05
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 2020-07-06
相关资源
最近更新 更多