Skip to content

建立 2026-09-15 更新 2026-09-15

Node.js + TypeScript

後端專案跟前端最大的差異:沒有 Vite/webpack 幫你處理編譯,需要自己決定「怎麼把 .ts 變成能被 node 執行的東西」。

初始化專案

mkdir my-api && cd my-api
npm init -y
npm install --save-dev typescript tsx @types/node
npx tsc --init
  • tsx:開發時直接執行 .ts 檔,不用手動跑 tsc(見 安裝與編譯)。
  • @types/node:Node.js 內建模組(fspathhttp……)的型別宣告檔,裝上之後 import fs from "node:fs" 才有型別提示,本身不含任何執行邏輯。

tsconfig.json 建議至少設定 targetmoduleoutDirrootDirstrict,範例見 tsconfig 常用設定

常見專案結構

my-api/
├── src/
│   ├── index.ts
│   └── routes/
├── dist/          ← tsc 編譯輸出(.gitignore 排除)
├── tsconfig.json
└── package.json

package.json 常見的兩個指令:

package.json
{
  "scripts": {
    "dev": "tsx watch src/index.ts",
    "build": "tsc",
    "start": "node dist/index.js"
  }
}

開發用 npm run dev(改檔案自動重跑);上線前用 npm run build 編譯成 JS,正式環境只需要 node dist/index.js,伺服器上不用裝 TypeScript。

搭配 Express 的型別

import express, { Request, Response } from "express"

const app = express()
app.use(express.json())

interface CreateUserBody {
  name: string
  email: string
}

app.post("/users", (req: Request<{}, {}, CreateUserBody>, res: Response) => {
  const { name, email } = req.body // name、email 都有正確型別,不是 any
  res.status(201).json({ name, email })
})

app.listen(3000)

express 官方套件已內建型別,Request<{}, {}, CreateUserBody> 的第三個泛型參數指定 req.body 的形狀,搭配 Interface 與 Type 描述請求資料,是最常見的用法。

相關資源

Node.js+TypeScript 的完整實作流程篇幅較長,目前沒有找到符合本站標準、單支影片就能講完的優質教學可以嵌入;影音教學 裡 Dave Gray 與 freeCodeCamp 的長篇課程都有涵蓋 Node.js 環境設定的段落,可從影片說明的章節時間軸找到對應片段。