Właśnie testuję maszynopis w VisualStudio 2012 i mam problem z jego systemem typów. Moja witryna HTML zawiera tag Canvas z identyfikatorem „mycanvas”. Próbuję narysować prostokąt na tym płótnie. Oto kod
var canvas = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
Niestety VisualStudio narzeka na to
właściwość „getContext” nie istnieje w wartości typu „HTMLElement”
Oznacza drugą linię jako błąd. Myślałem, że to tylko ostrzeżenie, ale kod się nie kompiluje. VisualStudio tak mówi
wystąpiły błędy kompilacji. Czy chcesz kontynuować i uruchomić ostatnią udaną kompilację?
W ogóle nie podobał mi się ten błąd. Dlaczego nie ma dynamicznego wywołania metody? W końcu metoda getContext na pewno istnieje w moim elemencie canvas. Pomyślałem jednak, że ten problem będzie łatwy do rozwiązania. Właśnie dodałem adnotację typu dla płótna:
var canvas : HTMLCanvasElement = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
Ale system typów nadal nie był zadowolony. Oto nowy komunikat o błędzie, tym razem w pierwszym wierszu:
Nie można przekonwertować „HTMLElement” na „HTMLCanvasElement”: w typie „HTMLElement” brakuje właściwości „toDataURL” z typu „HTMLCanvasElement”
Cóż, wolę statyczne pisanie, ale to sprawia, że język jest bezużyteczny. Czego oczekuje ode mnie system typów?
AKTUALIZACJA:
Maszynopis rzeczywiście nie obsługuje dynamicznych wywołań, a mój problem można rozwiązać za pomocą typecastów. Moje pytanie jest w zasadzie duplikatem tego TypeScript: casting HTMLElement
CanvasRenderingContext2D
zamiast tekstuany
.