Sto solo testando dattiloscritto in VisualStudio 2012 e ho un problema con il suo sistema di tipi. Il mio sito html ha un tag canvas con l'id "mycanvas". Sto provando a disegnare un rettangolo su questa tela. Ecco il codiceTypeScript: problemi con il sistema di tipi
var canvas = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
Purtroppo VisualStudio lamenta che
the property 'getContext' does no exist on value of type 'HTMLElement'
Essa segna la seconda linea come un errore. Ho pensato che questo sarebbe solo un avvertimento ma il codice non viene compilato. VisualStudio dice che
there were build errors. Would you like to continue and run the last successful build ?
Non mi è piaciuto affatto questo errore. Perché non esiste un'invocazione di metodo dinamica? Dopo tutto il metodo getContext esiste sicuramente sul mio elemento canvas. Tuttavia ho pensato che questo problema sarebbe stato facile da risolvere. Ho appena aggiunto un tipo annotiation per tela:
var canvas : HTMLCanvasElement = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
Ma il sistema di tipo ancora non ero soddisfatto. Ecco il nuovo messaggio di errore, questa volta in prima linea:
Cannot convert 'HTMLElement' to 'HTMLCanvasElement': Type 'HTMLElement' is missing property 'toDataURL' from type 'HTMLCanvasElement'
bene, sono tutti fuori per la tipizzazione statica, ma questo rende la lingua inutilizzabile. Cosa vuole che il sistema tipo mi faccia?
UPDATE:
Carattere tipografico ha infatti alcun supporto per l'invocazione dinamica e il mio problema può essere risolto con typecasts. La mia domanda è fondamentalmente un duplicato di questo TypeScript: casting HTMLElement
Vale la pena ricordare che è meglio usare 'CanvasRenderingContext2D' invece di' any' per il contesto canvas. –
Da TypeScript 1.8, riconoscerà l'argomento stringa costante '" 2d "', e '.getContext (" 2d ")' ritornerà con il tipo 'CanvasRenderingContext2D'. Non è necessario eseguire il cast esplicito. –