【SAPUI5】UI5 Tooling：コードチェックとオートコンプリート

##はじめに
本記事は、UI5 Toolingを使ってみるシリーズの4回目です。（1回目は[こちら](https://qiita.com/tami/items/9f6b573aefce12dfc626)）
ローカルIDEでの開発を効率的に行うために、コードチェックとオートコンプリートを追加します。
参考にしたのは以下の記事と動画です。

- [Linting and Formatting with ESLint in VS Code](https://scotch.io/tutorials/linting-and-formatting-with-eslint-in-vs-code)
- [Get started with the new UI5 tooling - Wouter Lemaire](https://www.youtube.com/watch?v=CLAI-bgaUnA&feature=youtu.be)

##コードチェック
以下の要領でESLintをインストールし、設定します。

###インストール
```
npm i -g eslint
```

###設定ファイルを作成

```
eslint --init
```
いくつかの質問がされるので、プロジェクトの用途に合わせて選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/b8b72c3d-3631-91a2-25d2-24905e480bd5.png)
.eslintrc.jsonファイルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/032c1725-20ce-ac11-2bb2-f31f798636ed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/0b55d6f9-080a-3541-49b7-8f21a31ad66a.png)

###設定ファイルを上書き
[Wouter Lemaire](https://people.sap.com/wouter.lemaire)さんが作成してくれた設定ファイルを使って.eslintrc.jsonファイルを上書きします。設定内容は以下のブログにあります。
[Migrate UI5 apps to UI5 Tooling in your local IDE](https://blogs.sap.com/2019/08/30/migrate-ui5-apps-to-ui5-tooling-in-your-local-ide/)

###ESLint extensionをインストール
Visual Studioでリアルタイムに警告を表示するには、ESLint extensionを入れます。
参考：[Linting and Formatting with ESLint in VS Code](https://scotch.io/tutorials/linting-and-formatting-with-eslint-in-vs-code)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/224dfde3-f1be-8c2a-398a-13dbc93e6dd7.png)
コードに問題がある場合は波線が出て警告してくれるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/1300f4fa-cac2-fb23-a747-202da733b1ae.png)
PROBLEMSタブにも警告、エラーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/4df861ee-ad29-02ee-bc9f-0f9de7debf6f.png)


##オートコンプリート
UI5のオートコンプリートを行うには、[@openui5/ts-types](https://www.npmjs.com/package/@openui5/ts-types)というモジュールを入れます。
仕組みとしてはTypeScriptのコンパイラを使って型のチェックを行っているそうです。
以下の要領でインストールし、設定します。

###インストール

```
npm install @openui5/ts-types --save-dev
```

###設定

tsconfig.jsonファイルを作成し、プロジェクトルート直下に置きます。

```json:tsconfig.json
{
    "compilerOptions": {
      "module": "none",
      "noEmit": true,
      "checkJs": true,
      "allowJs": true,
      "types": ["@openui5/ts-types"]
    }
  }
```

###使い始める前のおまじない
@openui5/ts-typesには、IDEを再起動しないとTypeScriptによるチェックが有効にならないという既知の問題があります。これを回避するために、どれか1つのJSファイルの先頭に`/// <reference types="@openui5/ts-types" /> #`と入れます。

###JSファイルを作成
追加のひと手間で、JSDocの形式でfunctionの引数と型を宣言します。これによってTypeScriptのコンパイラがUI5の型を認識できるようになります。

```javascript
/// <reference types="@openui5/ts-types" /> #
sap.ui.define([
  "sap/ui/core/mvc/Controller",
  "sap/m/Button",
  "sap/m/MessageToast"
], 
/**
 * @param {typeof sap.ui.core.mvc.Controller} Controller
 * @param {typeof sap.m.Button} Button
 * @param {typeof sap.m.MessageToast} MessageToast
 */
function(Controller, Button, MessageToast) {
```
結果、オートコンプリートがきくようになります。さらに、"Button"と入力するとButtonに関するドキュメントが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/dcccd7ec-1b0f-0df7-9dcf-6660bf439324.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/24fede44-c703-b849-160f-1cdbd9263145.png)


###制約
オートコンプリートが起動するためには、引数を先頭から全て指定する必要があります。上の例で、Buttonのidは必須ではありませんが、nullでもよいので何かしら指定しないと後続のパラメータが提案されませんでした。
また、オートコンプリートはJSファイルに対してだけ有効で、XMLビューでは効きません。

###UI5とTypeScript
上記はオートコンプリートのためにTypeScriptを借りるような形でしたが、UI5でTypeScriptを本格的に使うこともできます。以下のUI5Conの動画でその方法が紹介されています。
[UI5 with Typescript - Helmut Tammen](https://www.youtube.com/watch?v=Ww_w9MoOEkM&feature=youtu.be)