似たような処理をするクラス群で微妙に違うものを定義したい。
クラスとしても使えるし、コード補完で定義済みも用意されてる処理を実現したい。
のでちょっと実験してみた。
クラス中のクラス宣言はできなかったのだが
同名namespaceを利用してclassを拡張する事ができる
のを知った。
普通に行うとコンストラクタを利用して定義済みインスタンスを用意すればいいのだが
匿名クラスを直接実体化することで必要によりメソッドのオーバーライドも可能な実装が実現できた。
プロパティーが多い時にも対応できる。
TypeScriptでは定義さえも処理されることで実現されるため
定義と処理を混在させる事ができるため座標を少しづつずらした定義なのも簡単に実現できる。
以下テストコード※実用するにはImageが読み終わるまで待つなどの処理が必要
export class ImageResource{ public Image: HTMLImageElement; public Location: { x: number, y: number }; public Size: { w: number, h: number }; } export namespace ImageResource { let ImageA = new Image(); ImageA.src = "resource.png"; class DefaultResource extends ImageResource { Image = ImageA; Location = { x: 0, y: 0 }; Size = { w: 64, h: 64 }; } let x = 0, w = 64; export let Image1: ImageResource = new class extends DefaultResource { Location = { x: x, y: 0 } }; x += w; export let Image2: ImageResource = new class extends DefaultResource { Location = { x: x, y: 0 } }; x += w; export let Image3: ImageResource = new class extends DefaultResource { Location = { x: x, y: 0 } }; x += w; } //定義済み ImageResource.Image2;//VSでのコード補完での選択確認 //生成 let img=new ImageResource(); //img.でクラスメンバの候補のみ出てくるのを確認