Je teste juste du typographie dans VisualStudio 2012 et j'ai un problème avec son système de type. Mon site html a une balise canvas avec l'identifiant "mycanvas". J'essaye de dessiner un rectangle sur cette toile. Voici le code
var canvas = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
Malheureusement, VisualStudio se plaint que
la propriété 'getContext' n'existe pas sur la valeur de type 'HTMLElement'
Il marque la deuxième ligne comme une erreur. Je pensais que ce serait simplement un avertissement mais le code ne compile pas. VisualStudio dit que
il y a eu des erreurs de construction. Souhaitez-vous continuer et exécuter la dernière version réussie?
Je n'ai pas du tout aimé cette erreur. Pourquoi n'y a-t-il pas d'appel de méthode dynamique? Après tout, la méthode getContext existe définitivement sur mon élément canvas. Cependant, je pensais que ce problème serait facile à résoudre. Je viens d'ajouter une annotation de type pour le canevas:
var canvas : HTMLCanvasElement = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
Mais le système de type n'était toujours pas satisfait. Voici le nouveau message d'erreur, cette fois sur la première ligne:
Impossible de convertir «HTMLElement» en «HTMLCanvasElement»: le type «HTMLElement» ne contient pas la propriété «toDataURL» du type «HTMLCanvasElement»
Eh bien, je suis tout à fait pour le typage statique mais cela rend le langage inutilisable. Qu'est-ce que le système de typage veut que je fasse?
METTRE À JOUR:
Typescript n'a en effet aucun support pour l'invocation dynamique et mon problème peut être résolu avec les typecasts. Ma question est essentiellement un double de celui-ci TypeScript: casting HTMLElement
CanvasRenderingContext2D
au lieu deany
type pour le contexte de canevas.