“ResizeObserver”仅指一种类型,但在这里用作值

sut*_*hoy 9 typescript reactjs

我收到错误:'ResizeObserver' only refers to a type, but is being used as a value here尝试在 React 中使用 ResizeObserver 和 TypeScript 时。

我定义了以下接口,因为 TypeScript 不包含定义:

interface ResizeObserver {
    observe(target: Element): void;
    unobserve(target: Element): void;
    disconnect(): void;
}
Run Code Online (Sandbox Code Playgroud)

我在以下组件中使用它:

const useWidth = () => {

    const ref = useRef<HTMLObjectElement>(null);

    const [width, setWidth] = useState(0);

    useLayoutEffect(() => {

        var resizeObserver = new ResizeObserver(() => console.log("blah blah blah"))
        resizeObserver.observe(ref.current)

        return () => resizeObserver.disconnect()

    }, [ref.current])

    return [ref, width];
}
Run Code Online (Sandbox Code Playgroud)

Mei*_*hes 10

您应该安装@types/resize-observer-browsernpm 包来获取类型声明。如果您确实想推出自己的接口,可以通过文件declare var中的a 定义可更新的接口*.d.ts

declare interface ResizeObserver {
  observe(target: Element): void;
  unobserve(target: Element): void;
  disconnect(): void;
}

declare var ResizeObserver: {
  prototype: ResizeObserver;
  new(callback: ResizeObserverCallback): ResizeObserver;
};

interface ResizeObserverSize {
    inlineSize: number;
    blockSize: number;
}

type ResizeObserverCallback = (entries: ReadonlyArray<ResizeObserverEntry>, observer: ResizeObserver) => void;

interface ResizeObserverEntry {
    readonly target: Element;
    readonly contentRect: DOMRectReadOnly;
    readonly borderBoxSize: ResizeObserverSize;
    readonly contentBoxSize: ResizeObserverSize;
}
Run Code Online (Sandbox Code Playgroud)

然后它将在全球范围内可用(因为我相信它在浏览器中)并且您可以更新它:

在此输入图像描述

  • 在执行“npm install”之后,我是否需要导入 @types/resize-observer-browser 包?这些类型似乎没有被采纳。谢谢 (2认同)
  • 在你的 tsconfig 中,如果你有一个“types”条目,那么 typescript 将只使用这些条目 - 你需要将 `resize-observer-browser` 添加到该列表中。 (2认同)