重い腰を上げまして【記:あおたく】
こんばんは、あおたくです。
ここ数日は開発効率とメンテ性向上のためにずっと先送りにしていた TypeScript での開発環境の整備をしていました。していましたというか、まだ終わっていないので今もやっています。
解決したい課題
JavaScript は動的に型を解決する言語なので、コードを書いている段階ではその変数が指す型が何なのかわかりません。
確かに最近のエディタは賢いので、ある程度は推論してくれます。
const message = 'Hello, world.';
こういうコードを書いたとき、message
が文字列であることは自明で、実際 vscode はこれを string
として扱ってくれます。
しかし、外部のコードを参照している場合だとこういうわけにはいきません。
const sprite = new PIXI.Sprite();
この sprite
は any
という不明瞭な型になります。それは、困る。ただ、さいわいなことに pixi.js には型定義が存在するので、それを読み込めばわかるようにはなります。
ところが、ツクールのプラグイン開発には、もちろんツクールのコードを参照します。ツクールは TypeScript では書かれていないし、公式の型定義も存在しません。
RPGツクールMV のときは有志の TypeScript の型定義ファイルがあり、これがまず間違いないくらい正確なファイルだったので、これを使えば TypeScript でプラグイン開発できていました。幻葬再演で使っているプラグインは TypeScript で書かれています。
これと同等のものが、RPGツクールMZ には、実はありません。
現在ある RPGツクールMZ の型定義の問題点
型が不足している
_
ではじまる内部変数や内部関数の型定義が欠落しています。プラグインを開発するにあたっては既存のオブジェクトの実装を拡張したりしたいので、そのオブジェクトが持つ内部変数や内部関数にはアクセスする必要があります。が、それらの定義がなく、存在しないものとして扱われます。定義がモジュールとして export されている
ツクールのコアスクリプトは基本的にクラスや定数、それからもちろんグローバル変数も含めて、グローバルに定義されます。任意にモジュールを import する場合、import したモジュールだけがそのファイル内で定義されますが、実際には import しなくてもグローバルに定義されたクラスや定数は実行時に存在するため、import しなかった定義との衝突が起こる可能性があります。型がグローバルに定義されていれば衝突は事前に検知できます。バージョンアップに追従できていない
2020年に作られたっきりでコアスクリプトのバージョンアップに追従できていません。
ないものは作る
というわけで結局自作するしかなさそうです。調べるたびに自作するしかなさそうということを思っては、型定義を書き始めるのですが、量が量だけに大変で、中断してしまいがちでした。ただ、今後まだしばらくはツクールMZを使っていくことになるので、今このタイミングで型定義を作っておくことには意味があります。そんなわけで、重い腰を上げ、今なんとかやっています。
フォロワー以上限定無料
近況
無料