Je ne peux pas créer mon application React/TypeScript lorsque j'utilise le type MouseEvent
dans mon gestionnaire d'événements:
private ButtonClickHandler(event: MouseEvent): void
{
...
}
Je reçois:
error TS2322: Type '{ onClick: (event: MouseEvent) => void; children: string; }' is not assignable to type 'DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>'.
Type '{ onClick: (event: MouseEvent) => void; children: string; }' is not assignable to type 'ButtonHTMLAttributes<HTMLButtonElement>'.
Types of property 'onClick' are incompatible.
Type '(event: MouseEvent) => void' is not assignable to type 'EventHandler<MouseEvent<HTMLButtonElement>>'.
Types of parameters 'event' and 'event' are incompatible.
Type 'MouseEvent<HTMLButtonElement>' is not assignable to type 'MouseEvent'.
Property 'fromElement' is missing in type 'MouseEvent<HTMLButtonElement>'.`
J'ai aussi essayé MouseEvent<HTMLButtonElement>
mais ensuite j'ai eu error TS2315: Type 'MouseEvent' is not generic.
.
Pourquoi?
Extrait de mon package.json
:
"devDependencies": {
"@types/react": "^16.0.7",
"@types/react-dom": "^15.5.5",
"ts-loader": "^2.3.7",
"TypeScript": "^2.5.3",
"webpack": "^3.6.0"
},
"dependencies": {
"react": "^16.0.0",
"react-dom": "^16.0.0"
}
Edit # 1:
Liaison dans render()
:
<button onClick={ this.ButtonClickHandler }>Toggle</button>
en constructor
:
this.ButtonClickHandler = this.ButtonClickHandler.bind(this);
Je pense que ce qui se passe ici est qu’il existe deux types distincts disponibles: MouseEvent
de jsx/lib/js/js/web.jsx (qui n’a pas de paramètres de type) et React.MouseEvent<T>
de @ types/react/index.d.ts a un paramètre de type, T
, le type de l’élément dont il provient). TypeScript utilise typage structurel , donc, même s'il s'agit de types distincts, ils sont {peuvent compatibles. Mais pour être compatible avec le gestionnaire onClick
, vous devez utiliser la version de React, avec un type approprié pour T
(HTMLElement
fonctionnera ou vous pouvez être plus précis si vous savez à quel élément vous attachez ce gestionnaire).
Donc, event: MouseEvent
échoue car onClick
requiert la version spécialisée du type d'événement. event: MouseEvent<HTMLElement>
échoue car il fait référence au mauvais type MouseEvent
, celui sans paramètre de type. React.MouseEvent<HTMLElement>
fonctionne parce que vous obtenez le bon type, lui donnez le paramètre dont il a besoin et le type obtenu est compatible avec le gestionnaire onClick
.
Vous n'y croirez pas: il suffisait de déplacer l'assignation du constructeur pour rendre la fonction:
render()
{
return (
<button onClick={ this.Button_Click.bind(this) }>Toggle</button>
)}
Alors, MouseEvent
devient disponible:
private Button_Click(event: MouseEvent): void
Pourquoi cela se passe?