TypeScript 的编译过程是怎样的?tsconfig.json 有哪些关键配置?
1. 编译过程
- TypeScript 编译器(tsc)读取 .ts 源文件,进行词法分析、语法分析、类型检查
- 类型检查通过后,将 TypeScript 代码"擦除"类型注解,生成等效的 JavaScript 代码
- 编译过程不改变代码的运行时行为,仅移除类型信息
- 支持增量编译:只重新编译发生变化的文件,提升构建速度
- 支持项目引用(Project References):将大型项目拆分为多个子项目,实现更高效的增量构建
2. tsconfig.json 的作用
- tsconfig.json 是 TypeScript 项目的配置文件,定义了编译选项和包含的文件范围
- 运行 tsc 时会自动读取该配置,无需在命令行中重复指定选项
- 支持继承其他配置文件(extends),便于在多个项目间共享配置
3. 关键编译选项
- target:指定编译输出的 ECMAScript 版本(如 ES2020、ESNext)
- module:指定模块系统(ESNext、CommonJS、NodeNext、Bundler 等)
- moduleResolution:指定模块解析策略(node、node16、nodenext、bundler)
- strict:开启所有严格类型检查选项
- noEmit:仅执行类型检查,不生成输出文件(适用于 CI 或仅用于类型检查的场景)
- declaration:生成对应的 .d.ts 声明文件
- sourceMap:生成 source map 文件,便于调试
- outDir:指定编译输出目录
- include / exclude:指定需要编译或排除的文件范围
- skipLibCheck:跳过对声明文件(.d.ts)的类型检查,加快编译速度
- esModuleInterop:允许从 CommonJS 模块使用默认导入
4. 严格模式选项
- strict 是一个复合选项,开启后会自动启用以下检查:
- noImplicitAny:禁止隐式 any 类型
- strictNullChecks:null 和 undefined 只能赋值给自身或 never
- strictFunctionTypes:函数类型检查更严格
- strictBindCallApply:严格检查 bind、call、apply 的参数
- strictPropertyInitialization:类属性必须在构造函数中初始化
- noImplicitThis:禁止 this 隐式为 any
- alwaysStrict:始终以严格模式编译