typesafe
动态接口 ,是我以前没有写过的Ceylon 1.1中的一个新功能。 这是我和Enrique以及我的GSoC学生之一Corbin Uselton一起工作的。
通常,当我们与JavaScript对象进行交互时,我们是在一个dynamic
块内完成的,在dynamic
块中,锡兰通常惯用的类型检查受到抑制。 这种方法的问题在于,如果它是我经常使用的API,则我的IDE无法帮助我记住该API所有操作的名称和签名。
动态接口使将静态类型分配给未类型化JavaScript API成为可能。 例如,我们可以为HTML 5 CanvasRenderingContext2D
编写一个动态接口,如下所示:
dynamic CanvasRenderingContext2D {
shared formal variable String|CanvasGradient|CanvasPattern fillStyle;
shared formal variable String font;
shared formal void beginPath();
shared formal void closePath();
shared formal void moveTo(Integer x, Integer y);
shared formal void lineTo(Integer x, Integer y);
shared formal void fill();
shared formal void stroke();
shared formal void fillText(String text, Integer x, Integer y, Integer maxWidth=-1);
shared formal void arc(Integer x, Integer y, Integer radius, Float startAngle, Float endAngle, Boolean anticlockwise);
shared formal void arcTo(Integer x1, Integer y1, Integer x2, Float y2, Integer radius);
shared formal void bezierCurveTo(Integer cp1x, Integer cp1y, Integer cp2x, Float cp2y, Integer x, Integer y);
shared formal void strokeRect(Integer x, Integer y, Integer width, Integer height);
shared formal void fillRect(Integer x, Integer y, Integer width, Integer height);
shared formal void clearRect(Integer x, Integer y, Integer width, Integer height);
shared formal CanvasGradient createLinearGradient(Integer x0, Integer y0, Integer x1, Integer y1);
shared formal CanvasGradient createRadialGradient(Integer x0, Integer y0, Integer r0, Integer x1, Integer y1, Integer r1);
shared formal CanvasPattern createPattern(dynamic image, String repetition);
//TODO: more operations!!
}
dynamic CanvasGradient {
shared formal void addColorStop(Integer offset, String color);
}
dynamic CanvasPattern {
//todo
}
现在,如果我们将JavaScript的CanvasRenderingContext2D
实例分配给此接口类型,则在调用其方法时就不必位于dynamic
块内。 您可以通过单击“ TRY ONLINE”按钮在自己的浏览器中尝试一下!
CanvasRenderingContext2D ctx;
dynamic {
//get the CanvasRenderingContext2D from the
//canvas element using dynamically typed code
ctx = ... ;
}
//typesafe code, checked at compile time
ctx.fillStyle = "navy";
ctx.fillRect(50, 50, 235, 60);
ctx.beginPath();
ctx.moveTo(100,50);
ctx.lineTo(60,5);
ctx.lineTo(75,75);
ctx.fill();
ctx.fillStyle = "orange";
ctx.font = "40px PT Sans";
ctx.fillText("Hello world!", 60, 95);
注意,我们不需要为接口的每个操作都分配显式类型。 通过将它们声明为dynamic
,我们可以保留一些方法,甚至只是方法的某些参数都没有类型。 但是,只能从dynamic
块内调用此类操作。
请注意:动态接口是一种方便的小说。 它们可以帮助您更轻松地在IDE中使用API,但是在运行时,锡兰无法做任何事情来确保分配给动态接口类型的对象实际上实现了归因于它的操作 。
翻译自: https://www.javacodegeeks.com/2014/10/typesafe-apis-for-the-browser.html
typesafe