TS2532 - Возможно, объект не определен - useRef и react-three-fiber
Я реализую компонент с react-three-fiber, который выглядит так:
const Controls = (props: any) => {
const controlsRef = useRef();
const { camera, gl } = useThree();
useFrame(() => controlsRef.current && controlsRef!.current!.update());
// ^ Errors with Object is possibly 'undefined'
useFrame(() => {
if (controlsRef !== undefined && controlsRef.current !== undefined) {
controlsRef.current.target = new THREE.Vector3(worldMap.length / 2 * CELL_WIDTH, 0, worldMap.length / 2 * CELL_WIDTH)
// ^ ALSO errors with Object is possibly undefined
}
})
return (
<orbitControls
{...props}
ref={controlsRef}
args={[camera, gl.domElement]}
enableRotate
enablePan={false}
maxDistance={100}
minDistance={5}
maxPolarAngle={Math.PI / 3}
/>
);
};
Я пробовал добавить:
if (controlsRef !== undefined && controlsRef.current !== undefined) {
controlsRef!.current!.target = ...
// Errors with target does not exist on type 'never'
}
Так же как:
useFrame(() => controlsRef.current && controlsRef?.current?.update());
// Errors with update does not exist on type 'never'
Увы, безрезультатно. Я чувствую, как бьюсь головой о неподвижную стену Машинописи!
Что я делаю неправильно?
(При необходимости можно создать песочницу для кода)
1 ответ
Решение
Вам нужно будет указать типы для useRef
параметр генетического типа и инициализируйте его как null.
const controlsRef = useRef<OrbitControls>(null);
Я не уверен, какой именно интерфейс / набор текста использовать, поскольку я не знаком с библиотекой, с которой вы работаете, но это общая идея.
Кроме того, в вашем хуке useEffect будет достаточно использовать необязательную цепочку (если вы работаете с TypeScript 3.7.5 и выше).
useFrame(() => controlsRef?.current?.update());