ちょいハマったのでメモ。
実はTypeScriptでかけるGoogle Apps Script
多くのGASerは知っているので、詳しくは割愛しますが、ローカルトランスパイル不要で、clasp push
するだけで、自動的にサーバサイドでやってくれます(2018年の夏ぐらいから)。
Global Install
$ npm i -g typescript
$ npm i -g @google/clasp
$ npm i -g tslint
When start GAS project
$ clasp create <YOUR_GAS_PJ_NAME> --rootDir ./src
$ clasp pull
$ npm i -S @types/google-apps-script
$ tsc --init
$ tslint --init
GASの外部ライブラリどうするか問題
ScriptId指定で読み込む外部のライブラリをどう取り扱うかです。
例えばGAS利用者で人気のmoment.js。
普通のJavaScript処理系では、次のように使いますが
app.js
var moment = require('moment');
var now = moment();
GAS上では次のように使いますね。
app.gs
var now = Moment.moment();
本来の使い方では、エクスポートされた関数をそのままGlobal空間のなかで使えますが、GASの外部ライブラリは、名前空間の概念がないため、そのライブラリ名がGlobal空間の変数名となり、必ずLibraryName.LibraryMethod()
のように呼び出すことになります。
厄介なことに、ローカルの開発では外部ライブラリファイルは当然見えないため、tslintにいろいろ怒られるはめになります。
型定義が使えない
moment.jsには型定義ファイルがあります。ところが、上記の仕様のため、moment.d.tsの型定義ファイルを導入しても、そのままではGAS用TypeScriptで使えません。
ちなみにmoment.jsの型定義ファイルは、こうなってます。
moment/moment.d.ts
declare function moment(inp?: moment.MomentInput, format?: moment.MomentFormatSpecification, strict?: boolean): moment.Moment;
declare function moment(inp?: moment.MomentInput, format?: moment.MomentFormatSpecification, language?: string, strict?: boolean): moment.Moment;
declare namespace moment {
// メソッド定義のexport
}
export = moment;
型の補完を効かせたい
単純にこうしました。
gas/src/app.ts
const Moment = { moment : moment };
ただ、なんとなく納得が行かない感じが残ります。
型定義ファイルがない場合
これはもうDeclaretion宣言しかなさそう。
誰かいい方法知っていたら教えてください。