Express 项目使用 TypeScript | 青训营笔记

123 阅读2分钟

这是我参与「第四届青训营」笔记创作活动的的第 13 天

使用 TypeScript 可以让我们的代码变得更加安全,同时 IDE 也更容易能给出类型提示与语法提示,提升开发体验与开发效率。那么要怎么在 Express 中整合 TypeScript 呢?

安装依赖

想法是通过 nodemon 监控文件变化,然后通过 ts-node 来直接执行 .ts 文件。

下面安装依赖:

pnpm add -D typescript ts-node nodemon @types/express @types/node
pnpm add express

安装的两个 @types 开头的包是用于提供关于 express 和 nodejs 本身的一些 api 的类型提示的。

配置项目

安装完依赖之后就是配置项目,首先是 tsconfig.json 文件。可以使用自己的模板也可以使用 tsc --init ,根据自己喜好即可。

不重要的选项已经略去。

{
	"compilerOptions": {
		"rootDir": "./",
		"outDir": "./build"
	},
	"include": ["**/*.ts", "**/*.d.ts"]
}

然后就是在 package.json 中配置运行脚本:(同样略去了不重要的选项)

{
	"type": "module",
	"scripts": {
		"dev": "nodemon -e ts -w ./ -x pnpm run tsdev",
		"tsdev": "ts-node --esm main.ts"
	},
	"dependencies": {
		"express": "^4.18.1"
	},
	"devDependencies": {
		"@types/express": "^4.17.13",
		"@types/node": "^18.6.3",
		"nodemon": "^2.0.19",
		"ts-node": "^10.9.1",
		"typescript": "^4.5.4"
	}
}

这里的 tsdev 脚本是通过 ts-node 运行一次 main.ts

dev 脚本是通过 nodemon 监听 ts 文件变化,如果有变化的话,重新执行 tsdev 脚本,也就是重新运行 main.ts


到这里就配置完成了,愉快地在 main.ts 中使用 TypeScript 吧!

当然你也可能不愉快,因为有几个坑:

无法识别 ts 文件

在运行 ts-node 的时候,一定要加 --esm 参数,告诉 ts-node 你要使用的是 esm,这样才能够识别 ts 文件。

无法 import 本地 ts 文件

不论是在 esm 还是 commonjs 中,在引入本地的其他文件时,都有以下几种方式:

  • import/require 到父目录,会自动寻找目录下的 index.js 文件
  • import/require 到文件名,会自动补上 .js 后缀
  • import/require 精确到文件名以及后缀

但是不知道为什么在 ts-node 中,只能使用第三种方式,另外两种方式都会导致找不到模块。这个坑可害死人了,debug 大半天都试不出来, ts-node 的仓库里也没有提到这种解法。