[JavaScript]Node.js+express+yarn v3をTypeScript環境へ


フロントエンドではなく、バックエンドで使う。

パッケージ追加

yarn add typescript @types/express @types/node --dev

package.json編集

{
  "name": "sample",
  "version": "0.0.0",
  "license": "MIT",
  "type": "module",
  "engines": {
    "node": "~16.0.0"
  },
  "scripts": {
    "clean": "tsc --build --clean",
    "build": "tsc --build",
    "start": "node ./dist/index.js"
  },
  "packageManager": "yarn@3.2.1",
  "dependencies": {
    "express": "^4.18.1"
  },
  "devDependencies": {
    "@types/express": "^4.17.13",
    "@types/node": "^18.0.6",
    "jest": "^28.1.3",
    "typescript": "^4.7.4"
  }
}

ポイントはtypeとscriptsあたり。

“type”: “module”はESM Moduleとして認識させるために必要。

“scripts”はTypeScript関連。
tsconfig.jsonでJavaScript出力先を決めているので、そちらを指定。

ts-node/esmを使えば良いらしいけど、こちらの環境ではモジュールの参照絡みで上手くいかないため、TypeScript→JavaScriptを手動で。

CIツールなら、コマンドが1つ2つ増えたところで些細なもの。

{
  "compilerOptions": {
    /* Language and Environment */
    "target": "ES2022",                                  /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
    "lib": ["es2022"],                                        /* Specify a set of bundled library declaration files that describe the target runtime environment. */
    "moduleDetection": "auto",                        /* Control what method is used to detect module-format JS files. */

    /* Modules */
    "module": "Node16",                                /* Specify what module code is generated. */
    "rootDir": "./src",                                  /* Specify the root folder within your source files. */
    "moduleResolution": "Node16",                       /* Specify how TypeScript looks up a file from a given module specifier. */
    "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */

    /* Emit */
    "sourceMap": true,                                /* Create source map files for emitted JavaScript files. */
    "outDir": "./dist",                                   /* Specify an output folder for all emitted files. */
    "removeComments": true,                           /* Disable emitting comments. */

    /* Interop Constraints */
    "esModuleInterop": true,                             /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
    "forceConsistentCasingInFileNames": true,            /* Ensure that casing is correct in imports. */

    /* Type Checking */
    "strict": true,                                      /* Enable all strict type-checking options. */

    /* Completeness */
    "skipLibCheck": true                                 /* Skip type checking all .d.ts files. */
  },
  "ts-node": {
    "esm": true
  }
}

ts-nodeの定義は残骸。今回は要らない。

Node16やES2022を指定しているので、利用するライブラリ次第で自滅しそうだけど、クリーンな環境ってことで。特攻あるのみ。

とりあえず、expressのHello Worldは動かせたのでOKとしよう。

,