typescript 无法将HTMLDivElement分配给useRef< HTMLElement>

bvjveswy  于 2023-11-20  发布在  TypeScript
关注(0)|答案(1)|浏览(162)

在我的钩子中,我想保留一个对HTML元素的引用。元素的类型可以是从HTMLElement继承的任何类,如HTMLDivElementHTMLAnchorElement等。

const useSomething = () => {
  const ref = useRef<HTMLElement | null>(null);

  return ref;
};

const Component = () => {
  const ref = useSomething();

  return <div ref={ref} />;
};

字符串
类型HTMLDivElement继承自HTMLElement,但代码导致以下错误

Type 'MutableRefObject<HTMLElement | null>' is not assignable to type 'LegacyRef<HTMLDivElement> | undefined'.
  Type 'MutableRefObject<HTMLElement | null>' is not assignable to type 'RefObject<HTMLDivElement>'.
    Types of property 'current' are incompatible.
      Type 'HTMLElement | null' is not assignable to type 'HTMLDivElement | null'.
        Property 'align' is missing in type 'HTMLElement' but required in type 'HTMLDivElement'.ts(2322)


我通过AssertRefObject<HTMLDivElement>的引用解决了这个问题

<div ref={ref as RefObject<HTMLDivElement>} />;


但是强制性的是,人们不需要对组件中的ref执行任何额外的操作。

<div ref={ref}/>; // no warnings


有没有办法在组件中不使用ref as RefObject<HTMLDivElement>的情况下解决这个问题?

i5desfxk

i5desfxk1#

那么问题是你的类型在你的useRef中不正确.你允许它接受null作为可接受的引用类型.这不是你想要的.你想仍然保持你所期望的类型(而不是异常-即null)。其次要具体,如果可以的话使用HTMLDivElement类型。

useRef<HTMLDivElement>(null);

字符串
而不是

useRef<HTMLDivElement | null>(null);


你甚至可以输入<HTMLDivElement | HTMLElement>,但我不建议这样做。
所以你面临这个错误的原因是因为null对于你的引用来说不是一个可接受的类型,并且没有重叠(正如它所指出的那样)。

相关问题