abstractを使ってDOMとjQueryを透過的に扱う
abstractを使うと、「C言語のunion」みたいなのを型安全かつ便利に書ける。引数をabstractで受けると非常に便利。
例として、js.html.Elementとjs.JQueryを透過的に扱ってみる。
abstract Html(Element) { inline function new(x: Element) { this = x; } @:from public static inline function fromElement(x: Element): Html { return new Html(x); } @:to public inline function toElement(): Element { return this; } @:from public static inline function fromJQuery(x: JQuery): Html { return new Html(x[0]); } @:to public inline function toJQuery(): JQuery { return new JQuery(this); } }
function appendToBody(x: Html) { Browser.document.body.appendChild(x); //Html -> Element に暗黙の型変換 } var div = new JQuery("<div></div>"); appendToBody(div); //JQuery -> Html に暗黙の型変換
ここでは "abstract Html(Element)" とElement型を主にしてみたけど、JQuery型を主にした方が良いかもって気もするし、NodeListも扱えた方が…とか色々あるのだけど、このあたりは好みですね。