LoginSignup
6
4

More than 5 years have passed since last update.

TypeScriptでGASを書くときにMoment.jsの定義ファイルをどう使うか

Last updated at Posted at 2018-12-08

ちょいハマったのでメモ。

実は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宣言しかなさそう。

誰かいい方法知っていたら教えてください。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4