我只是在 VisualStudio 2012 中测试 typescript ,它的类型系统有问题。我的 html 网站有一个 canvas 标签,其 id 为“mycanvas”。我正在尝试在此 Canvas 上绘制一个矩形。这是代码
var canvas = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
不幸的是 VisualStudio 提示说
the property 'getContext' does no exist on value of type 'HTMLElement'
它将第二行标记为错误。我认为这只是一个警告,但代码无法编译。 VisualStudio 说
there were build errors. Would you like to continue and run the last successful build ?
我一点也不喜欢这个错误。为什么没有动态方法调用?毕竟 getContext 方法肯定存在于我的 Canvas 元素上。但是我认为这个问题很容易解决。我刚刚为 Canvas 添加了一个类型注释:
var canvas : HTMLCanvasElement = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
但类型系统仍然不令人满意。这是新的错误消息,这次在第一行:
Cannot convert 'HTMLElement' to 'HTMLCanvasElement': Type 'HTMLElement' is missing property 'toDataURL' from type 'HTMLCanvasElement'
好吧,我完全支持静态类型,但这会使该语言无法使用。类型系统要我做什么?
更新:
Typescript 确实不支持动态调用,我的问题可以通过类型转换来解决。我的问题基本上是这个问题的重复TypeScript: casting HTMLElement
最佳答案
var canvas = <HTMLCanvasElement> document.getElementById("mycanvas");
var ctx = canvas.getContext("2d");
或使用 any
类型的动态查找(无类型检查):
var canvas : any = document.getElementById("mycanvas");
var ctx = canvas.getContext("2d");
您可以在 lib.d.ts 中查看不同的类型.
关于html - TypeScript:类型系统的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13669404/