【Nestjs】Nestjsにおける推奨のtsconfig設定
概要
Nestjsのtsconfigを厳格にするために以下のことを行います。
- nest cliでprojectを作成する時は
--strict
オプションをつけてnewする。 - 上記で作成したtsconfig.jsonに以下の項目を追加。
- strictFunctionTypes
- strictPropertyInitialization
- noImplicitThis
- alwaysStrict
- forceConsistentCasingInFileNames
- noFallthroughCasesInSwitch
- noUnusedLocals
- noUnusedParameters
- exactOptionalPropertyTypes
- noImplicitReturns
- noUncheckedIndexedAccess
- noPropertyAccessFromIndexSignature
- noImplicitOverride
- isolatedModules
背景
NestjsでAPIを作成する時はnest cliを使用してprojectを始めると思います。
その時になんとなくOverview通りに進めているとtsconfig.jsonの設定が緩く、そのまま使用するのは危険です。
目的
tsconfig.jsonを変更して厳格に使用できる設定にしていくことが目的です。
設定・作成内容
nest cli
まず初めに、Nestjsを使ってAPIを構築しようとするとnest cliを使ってprojectを作成すると思います。
この第一歩目で落とし穴[1]があり、それはnest new ${projectName} --strict
でprojectを開始しないといけないということです。
この--strict
オプションをつけないと
- strictNullChecks
- noImplicitAny
- strictBindCallApply
- forceConsistentCasingInFileNames
- noFallthroughCasesInSwitch
がfalseの設定になってしまいます。
これだとたとえ後からtsconfigのcompilerOptionsにstrict:true
で追加してもstrictNullChecks,noImplicitAny,strictBindCallApply
は無効になってしまいます。(個別名で指定している値の方が優先されるためです)
ですので、上記のオプションはproject作成のコマンドでは必須になります。
tsconfig.jsonの設定項目追加
上記の内容で開始した上でtsconfig.jsonをより厳格にするためにCompiler Options[2]を追加していきます。
具体的には以下のoptionをtrueで追加します。
Compiler Option | Description |
---|---|
strictFunctionTypes | 引数の共変性を禁止する |
strictPropertyInitialization | クラスプロパティの初期化を必須にする |
noImplicitThis | thisの型注釈を必須にする |
alwaysStrict | javascriptでのstrictモードを有効にする |
forceConsistentCasingInFileNames | ファイル名の大文字と小文字を区別する |
noFallthroughCasesInSwitch | switch文でのfallthroughを禁止する |
noUnusedLocals | 使われていない変数の定義を禁止する |
noUnusedParameters | 使われない引数の定義を禁止する |
exactOptionalPropertyTypes | オプションプロパティにundefiendを代入することを禁止する |
noImplicitReturns | 関数戻り値の型注釈を必須にする |
noUncheckedIndexedAccess | インデックス型のプロパティや配列要素を参照する時にundefiendチェックを必須にする |
noPropertyAccessFromIndexSignature | インデックス型のプロパティ参照にブラケットでのアクセスを必須にする |
noImplicitOverride | メッソドオーバーライドにovverrideキーワードを必須にする |
isolatedModules | 各ファイルを独立して変換する時に解釈できないジードがある場合に警告する |
上記を適応した最終的なfileは以下になります。
{
"compilerOptions": {
"module": "commonjs",
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"target": "ES2021",
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./",
"incremental": true,
"skipLibCheck": true,
"strictNullChecks": true,
"noImplicitAny": true,
"strictBindCallApply": true,
"strictFunctionTypes": true,
"strictPropertyInitialization": true,
"noImplicitThis": true,
"alwaysStrict": true,
"forceConsistentCasingInFileNames": true,
"noFallthroughCasesInSwitch": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"exactOptionalPropertyTypes": true,
"noImplicitReturns": true,
"noUncheckedIndexedAccess": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitOverride": true,
"isolatedModules": true
}
}
これにて設定は完了です。
注意点
strict:true
を追加することで上記の中でまとめて設定できるものもありますが、バージョンによっては廃止される可能性があるため明示的に各項目を設定しています。
Discussion