Ich teste gerade Typoskript in VisualStudio 2012 und habe ein Problem mit seinem Typsystem. Meine HTML-Site hat ein Canvas-Tag mit der ID "mycanvas". Ich versuche ein Rechteck auf dieser Leinwand zu zeichnen. Hier ist der CodeTypeScript: Probleme mit dem System
var canvas = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
Leider beklagt, dass Visual Studio
the property 'getContext' does no exist on value of type 'HTMLElement'
Es markiert die zweite Zeile als Fehler. Ich dachte, das wäre nur eine Warnung, aber der Code kompiliert nicht. VisualStudio sagt, dass
there were build errors. Would you like to continue and run the last successful build ?
ich diesen Fehler überhaupt nicht mochte. Warum gibt es keinen dynamischen Methodenaufruf? Nach allen Methoden ist getContext definitiv auf meinem canvas-Element vorhanden. Ich dachte jedoch, dass dieses Problem leicht zu lösen wäre. Ich habe gerade einen Typ Annotiation für Leinwand hinzugefügt:
var canvas : HTMLCanvasElement = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
Aber das Typsystem war immer noch nicht zufrieden. Hier ist die neue Fehlermeldung, diesmal in der ersten Zeile:
Cannot convert 'HTMLElement' to 'HTMLCanvasElement': Type 'HTMLElement' is missing property 'toDataURL' from type 'HTMLCanvasElement'
Nun, ich bin für die statische Typisierung, aber das macht die Sprache unbrauchbar. Was will das Typsystem von mir?
UPDATE:
Typoskript hat in der Tat keine Unterstützung für dynamische Aufruf und mein Problem mit Typumwandlungen gelöst werden. Meine Frage ist im Grunde ein Duplikat dieser ein TypeScript: casting HTMLElement
Es ist erwähnenswert, dass es besser ist, 'CanvasRenderingContext2D' anstelle von' Any' für Canvas-Kontext zu verwenden. –
Seit TypeScript 1.8 erkennt es das konstante String-Argument '" 2d "' und '.getContext (" 2d ")' wird mit dem Typ 'CanvasRenderingContext2D' zurückgegeben. Sie müssen es nicht explizit umsetzen. –