Espruino TypeScript向けに espruino.d.ts を書いたっていうか書きかけ

Espruino Advent Calender 22日目です。

Web屋というのはソフトウェア開発者の中でも最も組込み系と縁が遠いところにいるような気がしていて、そんな立場でEspruinoを使っているとなんかこう微妙な気持ちになってくることがあります。
特に組込み系というと静的型付けという先入観があって、動的でそのへんをよくdisられるJavaScriptで書いてると、なんとなくなんか言われそうな強迫観念というか被害妄想というかそういうのが片隅に湧いたりします。っていうのはボクだけなんでしょう。

まあべつにJS好きだし普通に動くのでいいんですが、一方でEspruinoで込み入った制御を書いてるときはちょっとクラスにまとめてみたいなという欲求も出てきてTypeScriptを試してみようという気になってきました。
そんなわけでEspruinoの処理をTypeScriptで書いてみようと思いました。つまりTypeScriptで書いてコンパイルしたJSをEspruino IDEで転送する。というやり方です。

やってみると個人的にはなかなか気に入りました。しかしEspruinoでTypeScriptをやるとそのままでは動かないことがあります。
それはEspruino独自のグローバルオブジェクトがコンパイルエラーを起こすことです。

EspruinoにはA0, C6, LED1といったGPIO用などのグローバルなオブジェクトが存在します。また digitalWrite, analogRead, setWatchといった独自のグローバル関数もあります。
これらがTypeScriptでは未定義のオブジェクトとなりコンパイルエラーが出てJSが生成されません。

これはTypeScriptで jQueryやnode.jsなどのライブラリを使ってコードを書いても起こることで、型厳密を追求するTypeScriptの特長です。
解決するには各ライブラリ向けのdeclaration fileをつくります。拡張子は .d.ts です。

というわけで、Espruino向け declaration file espruino.d.ts を書きました。っていうか書きかけです。


bathtimefish/espruino.d.ts · GitHub

使い方は、.ts ファイルと同じディレクトリに置いて .tsの行頭に以下のコメントを書きます。

こうすることでコンパイル時にespruino.d.ts中のアンビエント宣言が参照されるようになります。
espruino.d.tsは今のところすべてのオブジェクトを定義できていません。ていうかすごく単純なことしか定義できてないです。anyだらけでゆるゆるです。
そもそもTypeScriptの declareやinterfaceの書き方がいまいちつかめなくてDefinitely Typedを参考にしながら手探りで書いてます。TS力が足りてない。。

まあ、Espruino独自のオブジェクトの型が定義されることで存在しないプロパティを参照したりする危険性が少なくなるのでいいかもしれません。
必要なところからぼちぼちアップデートしていこうと思います。

よく考えたらこの記事はEspruinoっていうかTypeScriptの記事だった気がしますが気にしないことにします。