TypeScript:types系统的问题
我只是在VisualStudio 2012中testing打字稿,并且对其types系统有问题。 我的HTML网站有一个ID为“mycanvas”的canvas标签。 我试图在这个canvas上画一个矩形。 这是代码
var canvas = document.getElementById("mycanvas"); var ctx: CanvasRenderingContext2D = canvas.getContext("2d"); ctx.fillStyle = "#00FF00"; ctx.fillRect(0, 0, 100, 100);
不幸的是VisualStudio抱怨
属性'getContext'在types'HTMLElement'的值上不存在
它将第二行标记为错误。 我认为这只是一个警告,但代码不能编译。 VisualStudio说
有构build错误。 你想继续并运行最后的成功构build?
我根本不喜欢这个错误。 为什么没有dynamic的方法调用? 毕竟getContext的方法肯定存在于我的canvas元素上。 但是我认为这个问题很容易解决。 我刚刚为canvas添加了一个types标注:
var canvas : HTMLCanvasElement = document.getElementById("mycanvas"); var ctx: CanvasRenderingContext2D = canvas.getContext("2d"); ctx.fillStyle = "#00FF00"; ctx.fillRect(0, 0, 100, 100);
但types系统仍然不满意。 这是新的错误信息,这次是在第一行:
无法将“HTMLElement”转换为“HTMLCanvasElement”:input“HTMLElement”缺less来自types“HTMLCanvasElement”的属性“toDataURL”
那么,我全力以赴进行静态打字,但这使得语言无法使用。 types系统要我做什么?
更新:
Typescript确实不支持dynamic调用,我的问题可以通过types转换来解决。 我的问题基本上是这一个TypeScript的重复:铸造HTMLElement
var canvas = <HTMLCanvasElement> document.getElementById("mycanvas"); var ctx = canvas.getContext("2d");
或使用any
types的dynamic查找(无types检查):
var canvas : any = document.getElementById("mycanvas"); var ctx = canvas.getContext("2d");
你可以看看lib.d.ts中的不同types。
看来这是在TypeScript的.9版本中得到纠正的: http : //blogs.msdn.com/b/typescript/archive/2013/03/25/working-on-typescript-0-9-generics-overload- on-constants-and-compiler-performance.aspx请参阅显式显示canvas标签的“Overload on Constants”部分。
我有同样的问题,但与SVGSVGElement而不是HTMLCanvasElement。 铸造到SVGSVGElement给编译时错误:
var mySvg = <SVGSVGElement>document.getElementById('mySvg');
无法将“HTMLElement”转换为“SVGSVGElement”:
types'HTMLElement'缺less'SVGSVGElement'types的属性'width'。
types'SVGSVGElement'缺less'HTMLElement'types的属性'onmouseleave'。
如果通过首先投射到“任何”来修复它:
var mySvg = <SVGSVGElement><any>document.getElementById('mySvg');
或者这样(它有相同的效果)
var mySvg: SVGSVGElement = <any>document.getElementById('mySvg');
现在mySvg被强制types为SVGSVGElement。