UseRef "относится к значению, но здесь используется как тип."

Я пытаюсь понять, как сказать, какой элемент используется в качестве ссылки, т.е. в моем случае

const circleRef = useRef<AnimatedCircle>(undefined);

AnimatedCircle — это компонент SVG из сторонней библиотеки, и его определение таким образом вызывает ошибку

UseRef &quot;относится к значению, но здесь используется как тип.&quot;

Есть ли какой-то универсальный способ определить, какой элемент является ref?

Можете ли вы поделиться определениями useRef и AnimatedCircle?

Evert 08.04.2019 17:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
47
2
75 833
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

AnimatedCircle — это функция, а не тип. Это означает, что его нельзя использовать в TypeScript вместо типа, как в общем ограничении useRef. Вместо этого вам нужно использовать typeof operator для преобразования в тип:

const circleRef = useRef<typeof AnimatedCircle | null>(null);

Функции-конструкторы обычно тоже являются типами, не так ли?

T.J. Crowder 08.04.2019 17:41

Да, но поскольку в OP указано, что AnimatedCircle — это тип компонента, и они получают эту ошибку, я готов поспорить, что это функция, а не класс.

Dan 08.04.2019 17:41

Неудачное имя для одного, если это не конструктор, так как оно нарушает основное правило именования JavaScript/TypeScript. :-)

T.J. Crowder 08.04.2019 17:42

В React все типы компонентов обычно имеют TitleCase. Имена в нижнем регистре используются для различения нативных элементов DOM (div, x-your-name-here и т. д.) и пользовательских компонентов React (AnimatedCircle). Хотя это нарушает соглашение JavaScript / машинопись, это соглашение в React в основном потому, что нет другого неуклюжего способа заставить React работать с пользовательскими элементами и/или новыми тегами.

Dan 08.04.2019 17:44

О, я о. знаком с этим, я просто привык думать о них как о конструкторах. Но, конечно, функциональные компоненты не являются, с точки зрения типов TypeScript, конструкторами, а с хуками практически все компоненты становятся функциональными. Немного боли, я ожидаю, что это будет решено. :-)

T.J. Crowder 08.04.2019 17:52

Для чего нужен | null?

raarts 24.04.2020 08:41

@raarts поздний ответ, извините! если вы использовали строгую проверку нулей в машинописном тексте, передача null в useRef не была (не является?) без явного добавления его в сигнатуру типа и привела бы к ошибке типа. useRef<typeof AnimatedCircle>(null); потерпит неудачу, потому что null нельзя присвоить typeof AnimatedCircle

Dan 27.04.2021 20:49

В моем случае я переименовал файл как .ts вместо .tsx. Повторное переименование исправило это.

чувак, вся моя беда была в этой ошибке! танки, вы только что исправили мою ситуацию, 3 часа в поисках всего интернета об этом.

tmos 03.02.2020 13:36

Я как раз собирался выбросить свой компьютер в окно — спасибо!! Расширение файла было последним местом, куда я собирался смотреть

Nick Zuber 09.07.2020 20:11

Я получал ту же ошибку в

ReactDOM.render(
<App store = {store} persistor = {persistor} basename = {PUBLIC_URL} />,
document.getElementById("root");

И я переименовал файл в .tsx, и это решило проблему. Причина в том, что когда вы используете React или ReactDOM, вам нужно переименовать файл в .tsx вместо ts. Для JavaScript.js работает, а для TypeScript.ts не работает.

Есть похожий вопрос с тем же ответом stackoverflow.com/questions/58341545/…

Michael Freidgeim 05.08.2021 16:16

Для меня проблема заключалась в том, что я пытался импортировать тип и использовал его для расширения типа:

import type ResultMap form...

пытался сделать Promise<typeof ResultMap>

Но это, если не работает, потому что

It’s important to note that classes have a value at runtime and a type at design-time, and the use is context-sensitive. When using import type to import a class, you can’t do things like extend from it. (Source: ts docs)

Другие вопросы по теме