TypeScript 与 tsconfig.json

TypeScript 与 tsconfig.json

本文将解释 TypeScript 和 tsconfig.json。

从 TypeScript 的基本作用出发,我们将结合具体示例说明 tsconfig.json 在项目中的作用。

YouTube Video

TypeScript 与 tsconfig.json

TypeScript 是“带有类型的 JavaScript”。然而,要在实际项目中高效地使用 TypeScript,正确理解并有意识地配置 tsconfig.json 极为重要

为什么我们需要 TypeScript?

首先,使用 TypeScript 的主要原因是**“能够在执行前发现错误”**。

1function add(a: number, b: number): number {
2  return a + b;
3}
4
5add(1, "2");

这段代码在 JavaScript 中只有在运行时才会报错,而在 TypeScript 中,会在编译时就产生类型错误

这种“提前发现”大大提升了开发效率和代码质量。

TypeScript 是如何执行的?

原则上,TypeScript 不能直接执行。你需要使用 tsc(TypeScript 编译器)将其转换为 JavaScript。

1npm install -D typescript
2npx tsc --init
  • 通过这个操作,会生成 tsconfig.json,它是定义 TypeScript 项目行为的核心文件

tsconfig.json 的作用是什么?

tsconfig.json 是一个配置文件,用于确定**“要包含哪些文件”、“使用什么规则”、“如何进行转换”**。虽然一开始看起来很复杂,但其实只有极少数配置真正重要。

1{
2  "compilerOptions": {
3    "target": "ES2020",
4    "module": "ESNext",
5    "strict": true
6  }
7}
  • 只要设置好这些,就可以进行现代且安全的 TypeScript 开发

target:输出的 JavaScript 版本

target 用于指定输出的 JavaScript 的规范级别

1"target": "ES2020"

这样,TypeScript 将输出等价于 ES2020 的 JavaScript。对于旧环境请选择 ES5,只支持最新版环境时可以选择 ES2022 等。

当指定 ESNext 时

1"target": "ESNext"
  • ESNext 表示将输出最新可用的 JavaScript 语法。TypeScript 不会转译这些语法,而是交由 Node.js 或浏览器等运行环境去处理。

  • 因此,ESNext 适用于只面向最新版 Node.js,或当你使用 Babel 或其他工具单独转译时。另一方面,如果运行环境不支持最新语法,可能会导致运行时错误,因此需要注意。

module:指定模块格式

module 用于指定模块格式

1"module": "ESNext"
  • ESNext 是前端和现代 Node.js 环境的标准选择。
  • 只有在需要 CommonJS 时才选择 "CommonJS"

strict:最大化类型安全性

strict最大化 TypeScript 安全性的开关

1"strict": true
  • 启用它会全方位捕捉模糊类型和潜在 bug。

strict 模式与隐式 any

启用 strict 后,TypeScript 会将无法推断类型的变量视为错误

1function printValue(value) {
2	console.log(value);
3}
  • 变量 value 在声明时没有类型信息,因此 TypeScript 无法确定其类型。结果会隐式使用 any,在 strict 模式下会触发警告(错误)。
1function printValue(value: number) {
2	console.log(value);
3}
  • 通过如此明确指定类型,TypeScript 能明白“这个变量只处理数字”。在 TypeScript 中,类型能被唯一确定类型能否省略更加重要。

include/exclude:控制要编译的文件

tsconfig.json 中,你可以指定要包含的文件要排除的文件

1{
2  "include": ["src"],
3  "exclude": ["node_modules"]
4}
  • 这样只有 src 下的文件会被 TypeScript 管理。
  • 即使在 include 指定的路径下,出现在 excludenode_modules 也会被排除。

outDir:指定输出目录

通过指定 outDir 来管理构建输出的位置。

1"outDir": "dist"
  • 这样,所有编译结果都会输出到 dist 文件夹。实际开发中,源代码与构建产物分离是标准做法。

rootDir:指定源码目录

rootDir 用于指定TypeScript 视为源码根目录的文件夹

1"rootDir": "src"
  • 此设置让 TypeScript 在输出文件时保持基于 src 的目录结构。 例如,src/index.ts 会被输出为 dist/index.js

  • rootDir 指定的目录结构会被复制到 outDir

esModuleInterop:桥接 CommonJS 和 ES 模块

接下来,我们来看一下 esModuleInterop

1"esModuleInterop": true
  • 启用后,你可以安全地用 import 语法引入 CommonJS 模块。
1import fs from "fs";
  • 在使用 Node.js 时,这个设置几乎是必需的

noImplicitAny:禁止隐式 'any' 类型

增强 tsconfig.json 中的类型检查也很重要。

1"noImplicitAny": true
  • 通过此设置,可以禁止隐式 any 类型。这样可以可靠地发现漏写类型的地方。

用于检测未使用代码的配置

用于检测未使用代码的设置也有助于提升可维护性。

1"noUnusedLocals": true,
2"noUnusedParameters": true
  • 有了这个,未使用的变量和参数会被立即警告出来。

lib:定义可用的内置 API

lib 是指定TypeScript 认为存在的标准 API的设置。

1"lib": ["ES2020", "DOM"]
  • 通过此设置,可以使用下列类型:。 选择 ES2020 后,可以使用例如 PromiseMapSet 等现代特性。 选择 DOM 后,可以使用如 documentwindowHTMLElement 等浏览器 API。

做前端时请包含 DOM;仅限 Node.js 项目时请移除 DOM,以避免引入不必要的全局类型

moduleResolution:模块查找规则

moduleResolution 用于确定import 语句中模块的解析方式

1"moduleResolution": "Node"

主要有以下两种选择:。

  • 指定 Node 时会采用 Node.js 的模块查找规则。
  • Classic 是旧的 TypeScript 专用方法,但现在很少使用。

在使用 Node.js 或打包工具的环境中,明确指定 Node 是安全的选择

最小化、可投入生产使用的 tsconfig.json

基于目前讲的内容,一个最小化、适用于生产环境的 tsconfig.json 如下所示:。

 1{
 2  "compilerOptions": {
 3    "target": "ES2020",
 4    "module": "ESNext",
 5    "moduleResolution": "Node",
 6    "lib": ["ES2020", "DOM"],
 7    "strict": true,
 8    "rootDir": "src",
 9    "outDir": "dist",
10    "esModuleInterop": true,
11    "noImplicitAny": true,
12    "noUnusedLocals": true,
13    "noUnusedParameters": true
14  },
15  "include": ["src"]
16}

此配置为前端和 Node.js 项目都提供了安全的基础。

总结:tsconfig.json 就是一份“规则手册”

tsconfig.json 不只是配置文件,更是适用于整个项目的“规则手册”tsconfig.json 可以清晰地定义以下重要规范:。

  • 类型安全级别。
  • 团队的编码规范。
  • 预防今后的 bug。

理解 tsconfig.json 后,你不仅能编写 TypeScript,还能为项目设计更安全的 TypeScript 使用方案。

您可以在我们的YouTube频道上使用Visual Studio Code跟随上述文章进行学习。 请也查看我们的YouTube频道。

YouTube Video