Я просто тестирую машинописный текст в VisualStudio 2012, и у меня проблема с его системой типов. На моем html-сайте есть тег холста с идентификатором «mycanvas». Я пытаюсь нарисовать прямоугольник на этом холсте. Вот код
var canvas = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
К сожалению, VisualStudio жалуется, что
свойство getContext не существует для значения типа HTMLElement
Вторая строка помечается как ошибка. Я думал, это будет просто предупреждение, но код не компилируется. VisualStudio говорит, что
были ошибки сборки. Хотите продолжить и запустить последнюю успешную сборку?
Мне эта ошибка совсем не понравилась. Почему нет вызова динамических методов? В конце концов, метод getContext определенно существует в моем элементе холста. Однако я думал, что эту проблему будет легко решить. Я только что добавил аннотацию типа для холста:
var canvas : HTMLCanvasElement = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
Но система типов все еще не устраивала. Вот новое сообщение об ошибке, на этот раз в первой строке:
Невозможно преобразовать HTMLElement в HTMLCanvasElement: для типа HTMLElement отсутствует свойство toDataURL из типа HTMLCanvasElement
Что ж, я очень люблю статическую типизацию, но это делает язык непригодным для использования. Что система типов хочет от меня?
ОБНОВИТЬ:
В Typescript действительно нет поддержки динамического вызова, и мою проблему можно решить с помощью преобразования типов. Мой вопрос в основном дублирует этот TypeScript: кастинг HTMLElement
CanvasRenderingContext2D
вместоany
type.