TypeScript 编译选项
编译选项控制 tsc 如何把 TS 转成 JS:目标版本、输出目录、检查严格程度等。它们既可写在 tsconfig.json 里,也可作为命令行参数传入,命令行指定时优先级更高。本节介绍最常用的一批选项。
选项的两种使用方式
方式一:写在 tsconfig.json 的 compilerOptions 中(推荐,随项目保存):
{
"compilerOptions": {
"target": "ES2020",
"outDir": "./dist"
}
}
方式二:命令行临时指定(适合临时覆盖):tsc hello.ts --outDir ./out --target ES5
输出相关选项
| 选项 | 作用 | 示例 |
|---|---|---|
| target | 编译到的 ES 版本 | ES5、ES2020、ESNext |
| module | 模块规范 | commonjs、esnext |
| outDir | 输出目录 | ./dist |
| rootDir | 输入根目录 | ./src |
| outFile | 合并输出为单文件(仅 amd/system 等) | ./bundle.js |
简单示例——把 src/hello.ts 编译到 dist,目录结构保持 src 下的相对路径:
// src/hello.ts
let msg: string = "你好";
console.log(msg); // 输出:你好
tsc src/hello.ts --outDir dist
// 生成 dist/hello.js
严格检查选项
| 选项 | 作用 |
|---|---|
| strict | 一键开启全部严格检查 |
| noImplicitAny | 禁止参数等隐式为 any |
| strictNullChecks | null/undefined 不能随意赋值 |
| noUnusedLocals | 未使用的局部变量报错 |
开启 noImplicitAny 后,下面代码会编译报错;给参数补上类型 function show(msg: string) 即可通过:
// 开启 noImplicitAny 后编译报错
function show(msg) { // 参数隐式为 any
console.log(msg);
}
show("hi"); // error TS7006: Parameter 'msg' implicitly has an 'any' type
工程辅助选项
| 选项 | 作用 |
|---|---|
| sourceMap | 生成 .map 源码映射文件 |
| declaration | 同时输出 .d.ts 类型声明 |
| removeComments | 编译结果去掉注释 |
| watch(-w) | 监听文件变化自动重编译 |
| noEmit | 只做类型检查,不输出 JS |
典型组合:调试用 sourceMap,发布库开 declaration,日常开发用 --watch:
tsc --watch // 改动即自动编译
tsc --declaration --sourceMap // 输出声明与源码映射
编译结果示例
// app.ts —— 使用可选链等新语法
const user = { info: { age: 18 } };
console.log(user?.info?.age); // 输出:18
不同 target 的编译差异:tsc app.ts --target ES2020 保留可选链语法;tsc app.ts --target ES5 降级为兼容旧浏览器的写法。
常用组合建议
开发期:tsc --watch --sourceMap --strict(改动即自动编译)。
发布期:先 tsc --noEmit 做全量类型检查,再 tsc --declaration --removeComments 正式产出。
小结
编译选项围绕「输出、检查、工程辅助」三类展开:target/outDir 决定产物形态,strict 系列决定检查力度,sourceMap/declaration/watch 提升开发体验。建议把常用选项固化在 tsconfig.json 中统一管理。