50 votes

useRef "fait référence à une valeur, mais est utilisé ici comme un type".

J'essaie de comprendre comment dire à react quel élément est utilisé comme ref, c'est-à-dire dans mon cas

const circleRef = useRef<AnimatedCircle>(undefined);

AnimatedCircle est un composant SVG provenant d'une bibliothèque tierce, et le définir de cette manière provoque une erreur

enter image description here

Existe-t-il un moyen universel de définir l'élément ref ?

2 votes

Pouvez-vous nous donner les définitions de useRef et AnimatedCircle ?

98voto

Ishmeet Singh Points 128

Dans mon cas, j'ai renommé le fichier en .ts au lieu de .tsx . Le fait de le renommer à nouveau a permis de résoudre le problème.

12 votes

Je n'ai jamais eu de problèmes à cause de cette erreur !

1 votes

J'étais sur le point de jeter mon ordinateur par la fenêtre - merci ! L'extension de fichier était le dernier endroit où j'allais regarder.

36voto

Dan Pantry Points 5799

AnimatedCircle es un fonction pas un type. Cela signifie qu'il ne peut pas être utilisé dans TypeScript à la place d'un type, comme dans la contrainte générique de useRef . Au lieu de cela, vous devez utiliser l'option typeof operator pour la convertir en un type :

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

5 votes

Les fonctions des constructeurs sont également des types, n'est-ce pas ?

1 votes

Oui, mais puisque l'OP indique que AnimatedCircle est un type de composant et qu'ils obtiennent cette erreur, je suis prêt à parier qu'il s'agit d'une fonction et non d'une classe.

0 votes

Un nom malheureux, s'il ne s'agit pas d'un constructeur, car il enfreint la règle de dénomination de base de JavaScript/TypeScript :-)

13voto

J'ai obtenu la même erreur dans

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

Et j'ai renommé le fichier en .tsx et cela a réglé le problème. La raison en est que, lorsque vous utilisez React o ReactDOM vous devez renommer le fichier en .tsx au lieu de ts . Pour JavaScript , .js fonctionne mais pour TypeScript , .ts ne fonctionnent pas.

0 votes

Il existe une question similaire avec la même réponse stackoverflow.com/questions/58341545/

0voto

Steffi Points 102

Pour moi, le problème est que j'ai essayé d'importer un type et de l'utiliser pour étendre un type :

import type ResultMap form...

a essayé de le faire Promise<typeof ResultMap>

Mais cela ne fonctionne pas, car

Il est important de noter que les classes ont une valeur au moment de l'exécution et un type au moment de la conception, et que leur utilisation dépend du contexte. Lorsque vous utilisez le type import pour importer une classe, vous ne pouvez pas faire des choses comme étendre à partir de cette classe. (Source : ts docs )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X