概要
DartからJavaScriptのライブラリにアクセスするためには基本的にDart専用の型定義のようなものを書くのが原則なんですが、TypeScriptの.d.tsと違い、誰も使ってないので全く揃っていない。
間の悪いことにGoogleはDart3.3からこの型定義の仕様を大幅に変えてしまったので、.d.tsからの変換ツールも軒並み更新を余儀なくされたもののどれも更新・対応する気配がまるで見えないという状況。
とりあえず
型厳密にしたい気持ちはわかるんですが、このままではずっと机上の空論のままなので、型厳密のことはとりあえず忘れて普通にJavaScriptのようにとりあえず存在すればglobalThisから.で繋いだらメンバにアクセスできるような感じでJavaScriptライブラリを使いたい。
解決策
Dartのすべての基本クラスであるObjectにはnoSuchMethod
というメンバが登録されており、これをオーバーライドすると(dynamic型経由で)存在しないメンバにアクセスしようとしたときに独自の処理ができるようになっているらしい。
意図的にどんなメンバにアクセスしようとしたかを単純に取得はできなくなってるっぽいが、今のところは特定の前後の文字列を削除するだけで対応できるみたい。
一応、dart/jsにはJavaScriptオブジェクトに対して文字列で名前を指定して関数やコンストラクタを呼び出したり
プロパティを取得したりする関数はあるのでそれをnoSuchMethod
から呼び出すことでそれっぽいことができるんじゃないかと。
成果物
いろいろ機能を付け足したら思った以上に複雑になった。