🍎

【Nestjs】Nestjsにおける推奨のtsconfig設定

2024/05/18に公開

概要

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でstrivtモードを有効にする
forceConsistentCasingInFileNames ファイル名の大文字と小文字を区別する
noFallthroughCasesInSwitch switch文でのfallthroughを禁止する
noUnusedLocals 使われていない変数の定義を禁止する
noUnusedParameters 使われない引数の定義を禁止する
exactOptionalPropertyTypes オプションプロパティにundefiendを代入することを禁止する
noImplicitReturns 関数戻り値の型注釈を必須にする
noUncheckedIndexedAccess インデックス型のプロパティや配列要素を参照する時にundefiendチェックを必須にする
noPropertyAccessFromIndexSignature インデックス型のプロパティ参照にブラケットでのアクセスを必須にする
noImplicitOverride メッソドオーバーライドにovverrideキーワードを必須にする
isolatedModules 各ファイルを独立して変換する時に解釈できないジードがある場合に警告する

上記を適応した最終的なfileは以下になります。

tsconfig
{
  "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を追加することで上記の中でまとめて設定できるものもありますが、バージョンによっては廃止される可能性があるため明示的に各項目を設定しています。

参考文献

脚注
  1. NestjsのstrictNullChecksがデフォルトでfalseなことについて ↩︎

  2. tsconfigのcomplier option公式ドキュメント ↩︎

Discussion