Browse Source

fix: typescript build issues utils (#924)

* fix: improve typing pixel ratio handling in setPixelRatio utility

- Add type safety for user-defined DPR array
- Enhance DPR calculation logic with explicit type checking
- Maintain existing behavior while improving code readability

* fix(devtools): enhance scene information payload structure

- Solved type issues
- Restructure scene info payload to use key-value array format
- Add support for rendering program details
- Improve type and readability of devtools scene information

* fix: improve type safety in retargeting proxy setter

- Add type checking for setter functions
- Ensure only valid function setters are called
- Prevent potential runtime errors with explicit type validation
Alvaro Saburido 3 months ago
parent
commit
e9b7bf97f7
3 changed files with 31 additions and 21 deletions
  1. 22 16
      src/devtools/plugin.ts
  2. 6 3
      src/utils/index.ts
  3. 3 2
      src/utils/primitive/createRetargetingProxy.ts

+ 22 - 16
src/devtools/plugin.ts

@@ -187,23 +187,29 @@ export function registerTresDevtools(app: DevtoolsApp, tres: TresContext) {
           }
 
           if (instance.isScene) {
-            payload.state.info = {
-              objects: instance.children.length,
-              memory: calculateMemoryUsage(instance),
-              calls: tres.renderer.value.info.render.calls,
-              triangles: tres.renderer.value.info.render.triangles,
-              points: tres.renderer.value.info.render.points,
-              lines: tres.renderer.value.info.render.lines,
+            payload.state = {
+              ...payload.state,
+              state: [
+                {
+                  key: 'Scene Info',
+                  value: {
+                    objects: instance.children.length,
+                    memory: calculateMemoryUsage(instance),
+                    calls: tres.renderer.value.info.render.calls,
+                    triangles: tres.renderer.value.info.render.triangles,
+                    points: tres.renderer.value.info.render.points,
+                    lines: tres.renderer.value.info.render.lines,
+                  },
+                },
+                {
+                  key: 'Programs',
+                  value: tres.renderer.value.info.programs?.map(program => ({
+                    ...program,
+                    programName: program.name,
+                  })) || [],
+                },
+              ],
             }
-            payload.state.programs = tres.renderer.value.info.programs?.map(program => ({
-              key: program.name,
-              value: {
-                ...program,
-                vertexShader: program.vertexShader,
-                attributes: program.getAttributes(),
-                uniforms: program.getUniforms(),
-              },
-            })) || []
           }
         }
       })

+ 6 - 3
src/utils/index.ts

@@ -459,9 +459,12 @@ export function setPixelRatio(renderer: { setPixelRatio?: (dpr: number) => void,
 
   let newDpr = 0
 
-  if (userDpr && is.arr(userDpr) && userDpr.length >= 2) {
-    const [min, max] = userDpr
-    newDpr = MathUtils.clamp(systemDpr, min, max)
+  if (userDpr && is.arr(userDpr)) {
+    const dprArray = userDpr as [number, number]
+    if (dprArray.length >= 2) {
+      const [min, max] = dprArray
+      newDpr = MathUtils.clamp(systemDpr, min, max)
+    }
   }
   else if (is.num(userDpr)) { newDpr = userDpr }
   else { newDpr = systemDpr }

+ 3 - 2
src/utils/primitive/createRetargetingProxy.ts

@@ -22,8 +22,9 @@ export function createRetargetingProxy<T extends Record<string | number | symbol
       return _target[prop]
     },
     set(_: any, prop: K, val: T[K]) {
-      if (setters[prop]) {
-        setters[prop](val, _target, proxy, setTarget)
+      const setter = setters[prop]
+      if (setter && typeof setter === 'function') {
+        setter(val, _target, proxy, setTarget)
       }
       else {
         _target[prop] = val