typesafe_浏览器的Typesafe API

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值