【问题标题】:Argument of type 'RefObject<HTMLDivElement>' is not assignable to parameter of type 'IDivPosition'“RefObject<HTMLDivElement>”类型的参数不可分配给“IDivPosition”类型的参数
【发布时间】:2022-01-26 22:32:43
【问题描述】:

我正在使用带有 React 的 Typescript。我为我的自定义函数创建了一个单独的文件DivPosition.tsx

我正在使用 useRef 将 div 元素的引用传递给我的函数,但在传递参数时出现错误。

const Home = () => {
    const divRef = useRef<HTMLDivElement>(null);
    const x = DivPosition(divRef);

    return (
        ...
    )
}

我的 DivPosition.tsx 代码:

interface IDivPosition{
    divRef: HTMLDivElement | null
}

export const DivPosition = ({divRef}: IDivPosition) => {

  useEffect(() => {
      console.log(divRef);
  });
    ...
  return x;
};

我收到一条错误消息: “RefObject”类型的参数不可分配给“IDivPosition”类型的参数。 “RefObject”类型中缺少属性“divRef”,但在“IDivPosition”类型中是必需的

【问题讨论】:

  • 显示useMousePosition钩子的代码。
  • 对不起,我在问题中将其命名错误。它实际上是一个“DivPosition”

标签: reactjs typescript react-hooks


【解决方案1】:

useRef的返回值为RefObject,类型定义

/*
* convenience overload for refs given as a ref prop as they typically start with a null value
*
* Usage note: if you need the result of useRef to be directly mutable, include `| null` in the type
* of the generic argument.
* @version 16.8.0
* @see https://reactjs.org/docs/hooks-reference.html#useref
*/
function useRef<T>(initialValue: T|null): RefObject<T>;

尝试:

import { MutableRefObject, useEffect, useRef } from 'react';

interface IDivPosition {
  divRef: RefObject<HTMLDivElement>;
}

export const useDivPosition = ({ divRef }: IDivPosition) => {
  useEffect(() => {
    console.log(divRef);
  });
  return null;
};

const Home = () => {
  const divRef = useRef<HTMLDivElement>(null);
  const x = useDivPosition({ divRef });

  return null;
};

软件包版本:

"react": "^16.14.0",
"@types/react": "^16.14.14",
"typescript": "^4.4.2"

此外,请以“use”开头的自定义挂钩命名。

我必须以“use”开头的自定义 Hooks 命名吗?请这样做。这个约定非常重要。没有它,我们将无法自动检查是否违反 Hooks 规则,因为我们无法判断某个函数是否包含对 Hooks 内部的调用。

【讨论】:

  • 这是不正确的。由 React 管理并使用 null 初始化的元素类型 T 的引用是 RefObject&lt;T&gt;。查源验证:github.com/DefinitelyTyped/DefinitelyTyped/blob/…
  • 现在出现错误:``` Type 'MutableRefObject' 不能分配给类型 'MutableRefObject'。输入'HTMLDivElement | null' 不可分配给类型 'HTMLDivElement'。类型“null”不可分配给类型“HTMLDivElement”。 ```
  • @jsejcksn 是的,你是对的,更新答案
  • 更新的解决了我的问题
猜你喜欢
  • 2019-06-24
  • 2021-06-14
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 2020-03-20
  • 1970-01-01
相关资源
最近更新 更多