【TS入門】tsconfigでよく使いそうなオプション

## はじめに
あけましておめでとうございます。
2023年初Qiitaです。
年末年始休みで始めたTypeScript入門の勉強ログ的なノリで書いていきます。
この記事が少しでも参考になれば嬉しいです。

## tsconfigとは
対象のTypeScriptファイル（.tsファイル）をJavaScriptコードへコンパイルする際のコンパイルオプションを記述するファイルであり、 **「TypeScriptがどのようにJavaScriptにコンパイルされるか」** を決定する、なくてはならない設定ファイルです。
通常はTypeScriptプロジェクトのルートフォルダに設置します。

https://www.typescriptlang.org/docs/handbook/tsconfig-json.html
>The presence of a tsconfig.json file in a directory indicates that the directory is the root of a TypeScript project. The tsconfig.json file specifies the root files and the compiler options required to compile the project.

訳：あるディレクトリにtsconfig.jsonファイルが存在する場合、そのディレクトリがTypeScriptプロジェクトのルートであることを示します。tsconfig.jsonファイルは、プロジェクトのコンパイルに必要なルートファイルやコンパイラのオプションを指定する。

## tsconfig.jsonの作成
tsconfig.jsonを作成するには、TypeScriptプロジェクトを初期化する必要があります。
そのためには、プロジェクトのルートフォルダで`tsc --init`コマンドを実行する必要があります。
このコマンドを実行することでTypeScriptに当該フォルダがプロジェクトのルートフォルダであることを伝えることができ、同時に`tsconfig.json`を作成してくれます。
※`tsconfig.json`内にはさまざまなオプションが記述されており、初期状態ではそのほとんどがコメントアウトされています。
![スクリーンショット 2023-01-03 23.47.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/65627d54-253a-81c7-f637-6b6a51afc126.png)

以下のセクションから、生成した`tsconfig.json`内で使用頻度が高いオプションの紹介をしていきます。

## 使用頻度が高そうなオプション集
### exclude 
TypeScriptのコンパイル処理に含めたくないファイルを指定することができるオプション。配列で記述します。
以下の記述だと、`exclude.ts`をコンパイルの対象として除外されるため、コンパイル後のJavaScriptも生成されません。
```json
"exclude": ["exclude.ts"]
```
ワイルドカードでの記述も可能です。
```json
"exclude": ["*.dev.ts"]
```
### include
TypeScriptのコンパイル処理に含めたいファイルを指定することができるオプション。配列で記述します。
以下の記述だと、`include.ts`をコンパイルの対象として含めることになります。
※excludeと同様にワイルドカードでの記述も可能
**includeオプションを設定した場合、当該オプションに記述されていないファイルは全てコンパイル対象外となります。**
```json
"include": ["include.ts"]
```
### target
コンパイル後のJavaScriptのバージョンを指定できるオプション。
TypeScriptはJavaScriptにコンパイルする際、JavaScriptに存在しない機能については、同じ動作をする代わりのコードを生成してくれます。
また、生成されたJavaScriptが、特定のバージョンのブラウザで動作するように考慮してコンパイルをしてくれます。
以下のような記述だと、全てのTypeScriptファイルがES6のバージョンのJavaScriptにコンパイルしてくれます。
```json
"target": "es6"
```
こちらのオプションを**ES5**に変更すると、コンパイルされたJavaScriptのバージョンもES5のコードとしてコンパイルされるので、ES5では対応していないTypeScriptのコードを、ES5でも動作する同様のコードにコンパイルされることになります。

tsconfig.json
![スクリーンショット 2023-01-04 0.32.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/6f18d9d6-0190-4059-2706-73bbe4048d9d.png)

app.ts
![スクリーンショット 2023-01-04 0.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/2af611e7-918a-16c8-b3c5-a410b2890354.png)

app.js
※ES5では`let`をサポートしていないため、代わりに`var`が使用されている
![スクリーンショット 2023-01-04 0.32.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/58085a2a-5cbf-cb47-1d2d-aff294627752.png)
### allowJs
TypeScriptファイルだけでなく、JavaScriptファイル（.js）もコンパイル対象に指定できるオプション。
こちらのオプションが**有効**だと、JavaScriptファイルもTypeScriptによってコンパイルされます。
### checkJs
JavaScriptのコードを、コードのチェック対象にすることができるオプション。
こちらのオプションが**有効**だと、JavaScriptのコンパイルはしませんが、コードのチェックだけを行ってくれます。
TypeScriptと同様に、エラーになるかもしれないコードの部分をコンパイルエラーによって教えてくれます。
### sourceMap
デバッグの際に、TypeScriptのファイルでデバッグをすることが可能になるオプション。
**こちらのオプションが無効の場合**
ブラウザの検証ツールでデバッグを行おうとした場合、JavaScriptファイルしか表示されません。
もしコンパイル後のコードが複雑であった場合、デバッグが難しくなります。可能であればTypeScriptのコードでデバッグしたい。
![スクリーンショット 2023-01-04 0.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/6c28fdcc-3828-fe6f-5968-d92efb8cab0d.png)
**こちらのオプションが有効の場合**
TypeScriptのコードも表示してくれるようになります。
![スクリーンショット 2023-01-04 0.59.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/a4bf1c73-299b-f7a5-3129-3a893f69d42d.png)
sourceMapをtrueにした状態でコンパイルを行うと、コンパイル後のJavaScriptコードとは別に、`app.js.map`というファイルが生成されます。
このファイルには、「TypeScriptとJavaScriptファイルの何行目と何行目が対応しているか」という紐付けの情報が記載されており、Chromeがそのファイルを解析することで、TypeScriptファイルでのデバッグを可能にしています。
![スクリーンショット 2023-01-04 1.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/57379c0f-b768-68f5-c8de-4311e45fe157.png)
### outDir
コンパイルされたJavaScriptコードの出力先を指定できるオプション。
以下の記述だと、`dist`ディレクトリにコンパイルされたJavaScriptのコードが出力されます。
```json
"outDir": "./dist"
```
![スクリーンショット 2023-01-04 1.28.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/0d6e97db-2bb5-72f8-6342-d42ffc1eb0e0.png)
### rootDir
ソースが配置されるrootのフォルダを指定するオプション。
以下の記述だと、`src`フォルダは以下にあるTypeScriptがコンパイル対象であることを明示的に指定するということになります。
```json
"rootDir": "./src"
```
上記のように、rootフォルダ（srcフォルダ）を明示的に指定した場合、srcフォルダの外にTypeScriptファイルが存在した場合はコンパイルエラーが出力されます。
### removeComment
コンパイル時にコメントを削除するオプション
これを**有効**にすると、コンパイル後のJavaScriptコードには、コメントアウトが削除された状態で出力されます。
### noEmit
JavaScriptを出力しないようにするオプション。
これを**有効**にすると、コンパイラはJavaScriptのファイルを作成しません。
ファイルを出力する時間を節約して、コードのチェックだけを行いたい場合などで利用できるかもしれません。
### noEmitOnError
コンパイルエラーがある場合に、JavaScriptを出力しないというオプション。
これを**有効**にすると、TypeScriptでコンパイルエラーが発生した場合に、JavaScriptのコードは作成されません。
デフォルトではfalseになっているため、たとえTypeScriptでコンパイルエラーが発生していたとしても、JavaScriptは生成されます。
### noImplicitAny
関数の引数に型を指定しない場合にエラーを出力するかどうかを指定できるオプション。
**こちらのオプションを無効にした場合**
引数の型を指定していなくてもエラーにはなりません。
無効かつ引数を指定していない場合は、暗黙的にany型として扱われます。
![スクリーンショット 2023-01-04 1.54.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/59a7937a-5dbe-942a-ec51-f965de520868.png)
**こちらのオプションを有効にした場合**
エラーが表示されます。（型を宣言するとエラーは解消されます）
![スクリーンショット 2023-01-04 1.55.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/0fc0163d-f0c5-4e65-1bed-4f21697da77e.png)
![スクリーンショット 2023-01-04 1.57.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/ad21cc34-f6ab-88c6-87fd-bdec2a3c6bde.png)
### strictNullChecks
nullの可能性があるオブジェクトに対し、nullチェックを行わずにアクセスする場合、エラーを出力するかどうかを指定できるオプション。
このオプションが有効になっている場合、nullかもしれないオブジェクトに対してアクセスする場合に、そのオブジェクトがnullである可能性を排除できない場合はエラーを返します。
**こちらのオプションを無効にした場合**
nullの可能性があるオブジェクトに対して、nullチェックなしでアクセスした場合でもエラーにはなりません。
![スクリーンショット 2023-01-04 2.20.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/96ed824b-6287-e10e-a6a5-3c3db970a264.png)
**こちらのオプションを有効にした場合**
エラーが出力されます。（nullチェックを行い、nullである可能性を排除すればエラーは解消します）
![スクリーンショット 2023-01-04 2.17.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/3fce2c77-c288-cf73-dbfa-7ac94c205325.png)
![スクリーンショット 2023-01-04 2.22.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/cd863f89-23e1-342e-8dfe-2c444cad52ef.png)
### strictBindCallApply
bind、call、applyの型チェックを厳しくするオプション。
**こちらのオプションを無効にした場合**
ビルトイン関数(`bind`、`call`、`apply`)の引数の型をチェックしません。
※以下画像内で呼び出されている関数の引数の型は`string`であるが、`int`が指定されている状態
![スクリーンショット 2023-01-08 21.58.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/c4073fe6-caf4-2f47-593d-df3affecbea6.png)
**こちらのオプションを有効にした場合**
`bind`、`call`、`apply`の型チェックが行われるようになり、呼び出す関数の引数の型を誤るとエラーを出力するようになります。
正しい型の引数を指定することにより、エラーは解消します。
![スクリーンショット 2023-01-08 22.02.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/1b070b55-c980-22cb-d86c-c635e3ec7d15.png)
![スクリーンショット 2023-01-08 22.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/51c308d5-aa19-9a82-68ab-9e802cf2a002.png)
### noUnusedLocals
利用されないローカル変数が存在する場合に警告を出すオプション
有効にすることで、未使用変数がある場合はコンパイル時に警告を出力することが可能になります。
![スクリーンショット 2023-01-08 22.09.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/f8710dea-71ec-c245-c94c-7f853d34fd7c.png)
![スクリーンショット 2023-01-08 22.09.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/0a113cc8-3528-63b1-5b8c-9c4020727f49.png)
### noUnusedParameters
利用されない引数が存在する場合に警告を出すオプション
有効にすることで、未使用引数がある場合はコンパイル時に警告を出力することが可能になります。
![スクリーンショット 2023-01-08 22.13.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/f841aacd-2b49-38bf-7382-f43c4313620e.png)
![スクリーンショット 2023-01-08 22.13.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/2678ed97-0791-5847-26c7-0f9915d8d312.png)
### noImplicitReturns
戻り値がvoid型以外の関数で、すべての条件分岐において値を返しているかを厳密に評価するためのオプション。
以下のような関数かつ、オプションが**無効**になっていた場合、引数が0以下であった場合に暗黙的にundefinedが返却されるようになります。
![スクリーンショット 2023-01-08 22.23.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/c6ede37c-aa61-1d61-456d-9cbb626c93a8.png)
オプションが**有効**である場合は警告が出力されます。
明示的にundefinedが返されることを宣言できていれば警告は解消されます。
![スクリーンショット 2023-01-08 22.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/03a29038-4e6f-9d3b-77fb-b0950887208b.png)
![スクリーンショット 2023-01-08 22.27.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1048570/ccf6548d-d4e6-96b8-a8b7-5d8ef2eae2ac.png)

以上になります。

## 終わりに
他にもよく使うオプションがあればコメント等でご教授ください。
今年はTypeScriptを一人前に扱うことができるよう頑張りたいと思います。

## 参考
https://typescriptbook.jp/reference/tsconfig

https://www.typescriptlang.org/docs/handbook/tsconfig-json.html