wails init
で生成されたコードはapp.go
のGreet
メソッドがフロントエンド側に公開されるように設定されている。
// Greet returns a greeting for the given name func (a *App) Greet(name string) string { return fmt.Sprintf("Hello %s, It's show time!", name) }
これがfrontend/wailsjs/go/main/App.d.ts
とfrontend/wailsjs/go/main/App.js
にそれぞれ下記のようにビルドされる。どうやら必ず非同期になるようだがそれはそうか。
export function Greet(arg1:string):Promise<string>;
export function Greet(arg1) { return window['go']['main']['App']['Greet'](arg1); }
これをFableで使うのはこんな感じ。いろいろ思うところはあるがまずは愚直に。
open Fable.Core open Fable.Core.JS type IApp = abstract Greet: string -> Promise<string> [<ImportAll("../wailsjs/go/main/App")>] let app: IApp = jsNative [<Global>] let console: JS.Console = jsNative (app.Greet "world") .``then`` (fun s -> console.log s) |> ignore
App.d.ts
の型を用途に合わせたインターフェースにマッピングして各種ImportXxx
属性でインポートする方式らしい。then
が予約語なので何とも言えなさを醸し出している。ついでにconsole
などはGlobal
属性で利用可能だ。
Promiseに関してはFable.Promiseというライブラリでパイプラインまたはコンピュテーション式として扱えるようなのでそれを検討すると良さそう。
型定義ファイルからインターフェースに転写するのダルい問題はts2fable
とやらを使うと良さそう。ところでd.ts扱えるTypeProviderはないんだろうか。