GAS + TypeScript + clasp + Emacsをようやく使い始めた

# 要約
- GASのJavaScriptで、プロパティ名をスペルミスしても怒られず、実行時にundefinedが帰ってくるのに困っていた
- こういう質問をすると、たいていの人がTypeScriptを使えと言ってくる
- 現実には、GASでTypeScriptを使ってエラーのあるコードを書いても、トランスパイルされたJavaScript（.gs）ではエラーにならないので、解決にならない
- ぼくはGASの開発はclaspを使ってローカルで行っている
- この場合、ローカルにtsc（TypeScript Compiler）を入れて、エラーチェックをしてからpushすればエラーフリーになる
- VSCodeでは、tscを使ってオンザフライにエラーチェックする機能があるらしい
- Emacsでも、tideというモジュールを使えば、オンザフライでエラーが表示されるので、それを直せばいい
- まとめると
 + Emacsでtideを使ってエラーフリーのtsを書く
 + それをGASにpushしてgsファイルにトランスパイルしてもらう
- 以上の手順でプロパティのスペルミスからは逃れられることが分かった
- (2020-07-13追記) tide.elを使うとタグジャンプができる。M-.で関数の定義に飛び、M-,で呼び出し元に戻る

# 困っていたこと
GASで開発していたが、JavaScript（GASの拡張子は.gs）で、オブジェクトのプロパティのスペルミスで困っていた。
![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107571/5c05dd25-6a53-60d7-d84d-c643820b999b.png)
上のプログラムでは、personという連想配列にsexというキーのプロパティを定義していたが、下でsexyと綴り間違いをしてしまっている。
これを実行すると
![SnapCrab_NoName_2020-3-18_14-56-55_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107571/3739153f-3b38-70d9-9fcd-3126e47c0120.png)
なんのエラーもなく実行され、person.sexyの値としてundefinedがしれっと出力される。
sex、sexy、ともに単なる文字列なので、間違って書いたかどうか、処理系には知る由もないのだ。
困る。
# TypeScriptにしてみたが
上記の問題を人に相談すると、たいていTypeScriptで解決する、と言われる。
やってみた。
後述するサイトを参考にTypeScript環境を設定し、以下のようにプログラムを書き直した。
letを変数宣言に追加しただけ。
![SnapCrab_NoName_2020-3-18_15-0-9_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107571/3d0de4ca-fe07-2fd8-052c-77ceb172622a.png)
上記のプログラムを、tsという拡張子で保存し、GASにpushする。
トランスパイルが行われ、gsは以下のようになる。
![SnapCrab_NoName_2020-3-18_15-4-18_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107571/8a8a1322-3562-0482-9b48-5b62a94af60e.png)
読んでもよく分からないプログラムになってしまったが、実行する。
![SnapCrab_NoName_2020-3-18_15-5-19_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107571/cc2ec311-741a-bd9c-3aba-abe6c3ca8e22.png)
特に変化もなく、何も怒られない。
ダメじゃん！
ここで諦めていた。

# Quoraで聞いてみた
上記の問題について、質問回答サイトのQuoraで聞いてみると、以下のことを教わった。
- GASのts＝＞gsトランスパイルは「変換モード」で行われているだけで、型チェックなどは抜かれている。
- 解決策としては、claspでpushする前に、ローカルでtscでトランスパイルする
- --noEmitというオプションを作るとエラーチェックだけ行われ、目的ファイルは作られない
- tscでエラーフリーのtsをpushすれば問題は解決する
- Visual Studio Codeであれば、tscを内部から呼び出して、オンザフライでエラーチェックする機能がある

なるほどー。

GAS + claspのエディターとして、VSCodeを使うことの利点は、他にもGASのクラス／メソッドを補完してくれるなど、いろいろあって素晴らしいらしい。
だがぼくは、変なこだわりで（他の作業とシームレスで行いたいので）claspのエディターにはEmacsを使いたい。

# tideを使う
調べると、tide.elというものをインストールすれば、Emacsでもオンザフライでtsのエラーチェックが出来るらしい。
導入してみた。

上記のソースを開くと、ちゃんと怒られた。
![SnapCrab_NoName_2020-3-18_15-14-58_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107571/569c23a3-4470-719b-d532-3eb217e7757c.png)
sexyというプロパティに赤いアンダーラインが付き、カーソルを当てるとミニバッファに、sexyというプロパティは存在しませんよ。sexと書きたかったんですかと怒られる。
この用途ではこれでバッチリだ。
# tsc --noEmit を使う
tscをコマンド実行すると、エラーメッセージが一括で得られる。
上記の通り、--noEmitをつけるとエラーチェックだけが行われる。
![SnapCrab_NoName_2020-3-18_15-18-49_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107571/e04141ca-e48b-a2cb-9405-45ec04cb67c3.png)
ところが、これだと、console.logという最もありふれた関数がエラーになってしまう。
なぜだろ。
わからないが、ぼくの目的にはEmacsでtideが怒ってくれるので良しとする。

# タグジャンプ (2020-07-13追記)
なお、tide.elを入れると、タグジャンプ機能が勝手に入る。
具体的に言うと、```foo()``` という関数にカーソルを当てて ```M-.``` と押すと、その関数定義にジャンプする。
ある関数定義の中で、 ```M-,``` と押すと、その関数の呼び出し元にジャンプする。

# むすび
ということで、GASの開発におけるプロパティのスペルミスという問題の解決には、clasp + TypeScript + Emacs + tsc + tide.elというのが有用であると分かった。
Web上にトランスパイルされるgsの見た目がメッチャ変わってしまうので、Web上で作業したい人と協働する場合は難しいが、時代はTypeScriptで間違いないようなので、個人でコントロールできる範囲で移行して行きたいと思っている。

# リンク集
上記の記事を書くために参考にしたページを挙げる。

###もともとのQiitaでのやりとり。
https://jp.quora.com/JavaScript%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E5%90%8D%E3%81%AF%E9%80%A3%E6%83%B3%E9%85%8D%E5%88%97%E3%81%AE%E3%82%AD%E3%83%BC/answers/203704995

この記事の内容とカブるが。。大変お世話になりました。

###claspでTypeScriptをセットアップする方法。
https://qiita.com/HeRo/items/f2ce057c6b1456e896ad

他の記事も参考にしたがこの記事が一番役に立った

###自分の記事。claspのセットアップについて。
https://qiita.com/query1000/items/259a60ba1be8743b858b

inquirerがないと怒られたときは`npm install inquirer`というところは参考になる（忘れていたので）。

###Emacsのtypescript-mode、tideのセットアップについて。
https://blog.takuchalle.dev/post/2018/10/17/emacs_typescript_setup/

要約。

- 以下のプログラムをLinuxにインストールする必要がある。
 + tsc
 + node（claspが入っている時点で入っている）

- 以下のパッケージをEmacsにインストールする必要がある。
 + typescript-mode
 + flycheck
 + company-mode
 + tide

- package-installの部分は、ぼくは`M-x package-list-packages`でパッケージリストを表示させて行った。

###tscのインストールについて
https://qiita.com/ochiochi/items/efdaa0ae7d8c972c8103

ぼくは`sudo npm install -g typescript`とする必要があった。
tsc --versionでバージョンを確認。

**（この項おわり）**