Je suis en train de tester Typescript dans VisualStudio 2012 et j'ai un problème avec son système de types. Mon site html possède une balise canvas avec l'id "mycanvas". J'essaie de dessiner un rectangle sur ce canevas. 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 une valeur de type HTMLElement
Il marque la deuxième ligne comme une erreur. Je pensais qu'il s'agirait simplement d'un avertissement, mais le code ne compile pas. VisualStudio dit que
il y avait des erreurs de construction. Voulez-vous continuer et exécuter la dernière construction réussie ?
Je n'ai pas du tout aimé cette erreur. Pourquoi n'y a-t-il pas d'invocation dynamique de méthodes ? Après tout, la méthode getContext existe bel et bien sur mon élément canvas. Cependant, je pensais que ce problème serait facile à résoudre. J'ai simplement ajouté une annotation de type pour canvas :
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 à la première ligne :
Impossible de convertir 'HTMLElement' en 'HTMLCanvasElement' : Type La propriété 'toDataURL' de 'HTMLElement' est manquante dans le type HTMLCanvasElement
Je suis tout à fait favorable au typage statique, mais cela rend le langage inutilisable. Qu'est-ce que le système de types veut que je fasse ?
UPDATE :
Typescript n'a en effet aucun support pour l'invocation dynamique et mon problème peut être résolu avec des typcasts. Ma question est essentiellement une duplication de celle-ci TypeScript : casting HTMLElement