ts-node 是最直接的 typescript 运行方式,它在内存中将 .ts 文件转为 js 后交由 node.js 执行,省去编译和配置流程;需本地安装、配 tsconfig.json,并注意 module 设置与路径别名支持。

ts-node 是最直接的运行方式
不编译成 JS 文件、不配置构建流程,想快速验证一段 typescript 逻辑,ts-node 就是答案。它在内存里把 .ts 文件转成 JS 再交给 Node.js 执行,省掉写 tsconfig.json、跑 tsc、再 node 的三步。
常见错误现象:Cannot find module 'ts-node' 或 TS_NODE_FILES is not set —— 本质是没装或没配对环境。
- 全局安装(不推荐):
npm install -g ts-node typescript;更稳妥的是项目本地装:npm install --save-dev ts-node typescript - 确保项目根目录有
tsconfig.json(哪怕空对象{}),否则ts-node可能忽略类型检查或路径别名 - 运行命令:
npx ts-node src/index.ts;如果报Cannot use import statement outside a module,大概率是tsconfig.json里"module"设成了"ESNext",临时改成"CommonJS"更稳
tsc --watch 适合开发时自动编译
需要生成真实 .js 文件(比如部署到没装 ts-node 的服务器),或者项目已有传统 Node.js 启动流程,就得用 tsc 编译。加 --watch 是为了省去每次改完手动敲命令。
使用场景:你写了 src/app.ts,希望保存后自动生成 dist/app.js 并保持监听。
- 先初始化配置:
npx tsc --init,它会生成默认tsconfig.json - 关键改两项:
"outDir": "./dist"(输出目录)和"rootDir": "./src"(源码目录),否则编译可能把node_modules也扫进去或报错找不到文件 - 启动监听:
npx tsc --watch;终端不会退出,改一个.ts文件就会触发一次编译 - 注意:
tsc --watch不会自动重启进程,编译完还得手动node dist/app.js或配合nodemon
用 nodemon + ts-node 实现“改保存即重启”
纯 ts-node 没热重载,纯 tsc --watch 不自动执行,两者合体才是开发流的舒适区。核心思路是让 nodemon 监听 .ts 文件变化,一变就调 ts-node 重跑。
性能影响:比纯 JS 稍慢(每次都要类型检查+转换),但对中小型项目感知不强;兼容性取决于 ts-node 版本是否支持你的 TS 语法(比如装饰器需额外配 "experimentalDecorators": true)。
- 安装:
npm install --save-dev nodemon ts-node typescript - 加脚本到
package.json:"dev": "nodemon --exec ts-node --files src/index.ts" -
--files很关键:默认nodemon只监听.js,加了它才响应.ts变化 - 如果用了路径别名(如
@/utils),得在tsconfig.json配"baseUrl"和"paths",且ts-node要读到这个配置(确保没用-T跳过类型检查)
常见报错和绕过方法
不是所有 TS 语法都能被 ts-node 或 tsc 默认支持,尤其涉及新特性或工程配置时,错误信息往往藏了线索。
-
TypeError: Cannot read property 'xxx' of undefined:不是 TS 问题,是 JS 运行时错误;ts-node不做运行时防护,类型检查通过 ≠ 代码不崩 -
error TS2307: Cannot find module 'xxx':检查tsconfig.json的"moduleResolution"(推荐"node")和"types"字段;第三方库缺类型定义?npm install --save-dev @types/xxx -
error TS1259: Module '"xxx"' can only be default-imported:说明该模块导出是export =形式,必须用import xxx = require('xxx'),不能import xxx from 'xxx' - Windows 下路径分隔符报错?把
tsconfig.json里的"outDir"改成正斜杠:"dist"而非"dist\"
tsconfig.json 不只是给编辑器看的,tsc、ts-node、甚至某些 IDE 插件都依赖它的一致性。改一个字段,可能整条链就断在你看不见的地方。











