You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ref绑定drei库自定义ShaderMaterial时出现TypeScript类型错误怎么办?

解决drei ShaderMaterial使用ref的TypeScript类型错误

核心问题:你定义的PolygonMat是JSX组件的props类型,但shaderMaterial组件的ref绑定的是Three.js的ShaderMaterial实例,两者类型不匹配导致报错。以下是具体修复步骤:

1. 扩展ShaderMaterial类型以包含自定义uniform

给Three.js的ShaderMaterial添加自定义uniform字段,确保通过ref访问时能获得正确的类型提示:

import { ShaderMaterial } from 'three'

declare module 'three' {
  interface ShaderMaterial {
    uniforms: {
      uTime: { value: number }
      // 其他自定义uniform可在此添加
    }
  }
}

2. 修正JSX组件的类型声明

全局JSX类型只需定义组件的props,无需混入ref的类型:

type PolygonMatProps = {
  uTime: number
} & JSX.IntrinsicElements['shaderMaterial']

declare global {
  namespace JSX {
    interface IntrinsicElements {
      polygonMaterial: PolygonMatProps
    }
  }
}

3. 正确定义ref的类型

组件中ref的类型应为RefObject<ShaderMaterial>,而非之前的PolygonMat:

import { useRef } from 'react'
import { useFrame } from '@react-three/fiber'
import { ShaderMaterial } from 'three'

function YourComponent() {
  const materialRef = useRef<ShaderMaterial>(null)

  useFrame((state) => {
    if (materialRef.current) {
      materialRef.current.uniforms.uTime.value = state.clock.getElapsedTime()
    }
  })

  return (
    <mesh>
      <polygonMaterial
        ref={materialRef}
        uTime={0}
        vertexShader={`/* 你的顶点着色器代码 */`}
        fragmentShader={`/* 你的片元着色器代码 */`}
      />
    </mesh>
  )
}

报错原因说明

你之前误将JSX组件的props类型PolygonMat当作ref的类型,但shaderMaterial组件的ref实际指向Three.js底层的ShaderMaterial实例,并非组件props对象,因此类型不兼容。通过扩展Three.js的ShaderMaterial类型,既能保留自定义uniform的类型提示,又能让ref类型匹配。

内容的提问来源于stack exchange,提问作者bluhtea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:07:08