reactjs 当使用“useCallback”作为回调引用时,如何正确设置TypeScript声明?

kd3sttzy  于 2023-01-25  发布在  React
关注(0)|答案(3)|浏览(156)

我正在处理一个React + TypeScript项目,在该项目中,我引入了提供的“如何测量DOM节点?”示例,但我似乎无法让React的类型确认这样一个场景,即有人将useCallback的返回值作为ref传入。如果您打开它,您应该会在此行中看到TypeScript错误指示符:

<div ref={ref} className="App">

应该如何设置类型以使其有效,或者@types/react包中是否缺少某些东西?

blpfk2vs

blpfk2vs1#

首先将null添加到useCallback中的节点类型,然后将as const添加到返回的数组中,这将使返回的数组类型化为元组(记住类型的顺序),而不是使其成为多个类型的数组

function useClientRect() {
  const [rect, setRect] = useState<DOMRect>();

  const ref = useCallback((node: HTMLElement | null) => {
    if (node !== null) {
      setRect(node.getBoundingClientRect());
    }
  }, []);

  return [rect, ref] as const;
}
gupuwyp2

gupuwyp22#

useClientRect挂钩的返回类型设置为[ClientRect | undefined, (node: HTMLDivElement) => void],并将useCallback的参数类型更改为HTMLDivElement

// packages
import { useCallback, useState } from "react";

function useClientRect(): [
  ClientRect | undefined,
  (node: HTMLDivElement) => void
] {
  const [rect, setRect] = useState<ClientRect>();

  const ref = useCallback((node: HTMLDivElement) => {
    if (node !== null) {
      setRect(node.getBoundingClientRect());
    }
  }, []);

  return [rect, ref];
}

export default useClientRect;
kse8i1jr

kse8i1jr3#

在你的use-client-react中,你传递了一个不存在的ClientRect类型,下面的代码对我来说很好用。

import { useCallback, useState } from "react";

function useClientRect() {
  const [rect, setRect] = useState();

  const ref = useCallback((node: HTMLDivElement) => {
    if (node !== null) {
      setRect(node.getBoundingClientRect());
    }
  }, []);

  return [rect, ref];
}

export default useClientRect;

相关问题