【问题标题】:'ResizeObserver' only refers to a type, but is being used as a value here'ResizeObserver' 仅指一种类型,但在此处用作值
【发布时间】:2020-04-28 05:43:09
【问题描述】:

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

我将以下接口定义为 TypeScript 不包含定义:

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

我在以下组件中使用它:

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];
}

【问题讨论】:

    标签: reactjs typescript


    【解决方案1】:

    您应该安装@types/resize-observer-browser npm 包to get the type declarations。如果你真的想自己动手,你可以通过declare var*.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;
    }
    

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

    【讨论】:

    • 在执行npm install 之后是否需要导入@types/resize-observer-browser 包?这些类型似乎没有被拾取。谢谢
    • 在您的 tsconfig 中,如果您有一个“类型”条目,那么 typescript 将只使用这些条目 - 您需要将 resize-observer-browser 添加到该列表中。
    • 我的typeRoots 中有node_modules/@types,我认为这就足够了。将resize-observer-browser 显式添加到types 也解决了这个问题。谢谢!
    猜你喜欢
    • 2018-08-07
    • 2021-08-23
    • 2020-12-05
    • 2018-03-31
    • 1970-01-01
    • 2023-04-03
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多