Как бы вы правильно настроили объявление TypeScript при использовании «useCallback» для ссылки обратного вызова? - PullRequest
0 голосов
/ 23 января 2020

Я работаю над проектом React + TypeScript, в котором я использовал предоставленный пример " Как я могу измерить узел DOM? ", но мне кажется, что я не могу получить Типы реагирования для подтверждения сценария, в котором кто-то передает возвращаемое значение useCallback как ref. Я воссоздал его использование в этом CodeSandbox . Если вы откроете это, вы увидите индикатор ошибки TypeScript в этой строке:

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

Как именно следует настроить типы, чтобы сделать это допустимым, или в пакете @types/react что-то отсутствует?

Ответы [ 3 ]

1 голос
/ 23 января 2020

Сначала добавьте null к типу узла внутри useCallback и добавьте as const к возвращенному массиву, который будет возвращать возвращаемый массив как кортеж (запомните порядок типов) вместо того, чтобы делать его массивом несколько типов

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

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

  return [rect, ref] as const;
}
0 голосов
/ 23 января 2020

В вашем 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;

0 голосов
/ 23 января 2020

Установить тип возврата для useClientRect hook на [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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...