目录

一、基础认知:tsconfig.json 核心价值与生成方式

1.1 核心价值

1.2 快速生成配置文件

1.3 基本结构

二、顶配模板:完整配置

三、模块拆解:逐行解析所有核心配置项

3.1 基础编译配置(必配项)

3.2 严格类型检查(强烈建议开启)

3.2.1 noImplicitAny

3.2.2 strictNullChecks

3.2.3 strictFunctionTypes

3.3 模块解析与路径别名(工程化关键)

3.3.1 核心配置

3.3.2 打包工具适配(Vite 示例)

3.3.3 使用示例

3.4 代码质量与错误校验

3.4.1 noUnusedLocals & noUnusedParameters

3.4.2 noUncheckedIndexedAccess

3.5 类型声明文件配置

3.5.1 typeRoots & types

3.5.2 自定义类型声明示例

3.6 编译输出控制(产物管理)

3.6.1 前端项目(Vite/Webpack)

3.6.2 组件库 / 工具库

3.6.3 Node.js 项目

3.7 性能优化 配置(大型项目必备)

3.8 实验性 / 高级特性(场景化使用)

3.8.1 装饰器(Angular/NestJS 专用)

四、范围控制:include/exclude/files/extends/references

4.1 include & exclude(编译范围)

4.2 extends(配置继承)

4.2.1 基础配置文件(tsconfig.base.json)

4.2.2 子项目配置文件(src/app/tsconfig.json)

4.3 references(项目引用)


TypeScript的tsconfig.json文件是项目编译的核心配置文件,它定义了编译规则和文件范围,直接影响项目的编译结果和开发体验。

一、基础认知:tsconfig.json 核心价值与生成方式

1.1 核心价值

tsconfig.json 是 TypeScript 编译器(tsc)的配置入口,其核心作用包括:

  • 定义编译规则(目标版本、模块系统、输出目录等)
  • 控制类型检查严格程度(杜绝隐式 any、null 引用等问题)
  • 管理工程范围(指定编译 / 排除文件、路径别名、多项目依赖)
  • 优化编译性能(增量编译、跳过无用检查)
  • 适配不同运行环境(浏览器 / Node.js/ 小程序)

tsconfig.json 是 TypeScript 项目的核心配置文件,用于控制编译行为、类型检查规则、模块解析策略、文件包含/排除范围等。

1.2 快速生成配置文件

# 生成带全注释的默认配置(新手推荐)即生成默认配置文件
tsc --init
 
# 生成极简配置(仅保留核心项)
tsc --init --minimal

生成的默认配置示例:

{
  "compilerOptions": {
    "target": "ES6",
    "module": "CommonJS",
    "strict": true,
    "outDir": "dist"
  },
  "include": ["src/**/*.ts"]
}

1.3 基本结构

一个典型的 tsconfig.json 结构如下:

{
  "compilerOptions": {
    // 编译选项(最重要)
  },
  "include": [],        // 包含哪些文件
  "exclude": [],        // 排除哪些文件
  "files": [],          // 显式指定文件(优先级高于 include)
  "extends": "",        // 继承其他配置
  "compileOnSave": true,// compileOnSave的值是true或false,如果设为true,在我们编辑了项目中的文件保存的时候,编辑器会根据tsconfig.json中的配置重新生成文件,不过这个要编辑器支持
  "references": []      // 项目引用(monorepo)
}

⚠️ 注意:tsconfig.json是 TypeScript 项目的配置文件,放在项目的根目录。反过来说,如果一个目录里面有tsconfig.json,TypeScript 就认为这是项目的根目录。

二、顶配模板:完整配置

{
  /* ========================== 核心编译配置 ========================== */
  "compilerOptions": {
    /* -------------------------- 基础编译目标 -------------------------- */
    // 编译后的 JavaScript 版本(企业推荐 ES2020,兼容 Chrome 80+/Node.js 14+)
    "target": "ES2020",
    // 模块系统类型:前端用 ESNext(配合 Vite/Webpack),Node 用 CommonJS
    "module": "ESNext",
    // 指定编译器需要包含的内置库(DOM 适配浏览器,ESNext 包含最新语法)
    "lib": ["ESNext", "DOM", "DOM.Iterable"],
    // JSX 编译模式:React 17+ 用 react-jsx,Vue 用 preserve,React 16 用 react
    "jsx": "react-jsx",
    // 模块解析策略:Bundler 适配 Vite/Webpack,Node 适配 Node.js 运行时
    "moduleResolution": "Bundler",
    // 启用 ES 模块与 CommonJS 模块互操作(解决 import React from 'react' 报错)
    "esModuleInterop": true,
    // 允许合成默认导入(即使模块没有默认导出也能 import xxx from 'xxx')
    "allowSyntheticDefaultImports": true,
    // 强制文件名大小写一致(避免 Windows/Linux 跨平台问题)
    "forceConsistentCasingInFileNames": true,
    // 允许导入 JSON 文件(如 import pkg from './package.json')
    "resolveJsonModule": true,
    // 强制每个文件作为独立模块编译(适配打包工具,避免全局变量污染)
    "isolatedModules": true,
 
    /* -------------------------- 严格类型检查 -------------------------- */
    // 开启所有严格类型检查(企业级项目必须开启,是类型安全的核心)
    "strict": true,
    // 禁止隐式 any 类型(所有变量/参数必须显式指定类型)
    "noImplicitAny": true,
    // 严格的 null/undefined 检查(必须显式判断,杜绝 "cannot read property of undefined")
    "strictNullChecks": true,
    // 严格的函数类型检查(防止参数/返回值类型不匹配)
    "strictFunctionTypes": true,
    // 严格检查 bind/call/apply 的参数类型(避免传参错误)
    "strictBindCallApply": true,
    // 强制类属性初始化(防止未初始化的属性导致运行时错误)
    "strictPropertyInitialization": true,
    // 禁止隐式 this 类型(this 必须有明确的类型声明)
    "noImplicitThis": true,
    // catch 语句的变量默认类型为 unknown(需显式类型收窄,更安全)
    "useUnknownInCatchVariables": true,
 
    /* -------------------------- 代码质量校验 -------------------------- */
    // 禁止未使用的局部变量(减少死代码,提升代码整洁度)
    "noUnusedLocals": true,
    // 禁止未使用的函数参数(规范函数定义,避免参数冗余)
    "noUnusedParameters": true,
    // 强制函数所有分支都有返回值(避免隐式 undefined 返回)
    "noImplicitReturns": true,
    // 禁止 switch 语句的 case 穿透(必须写 break/return,避免逻辑错误)
    "noFallthroughCasesInSwitch": true,
    // 禁止未检查的索引访问(如 arr[0] 需先判断数组长度,obj.key 需先判断 key 存在)
    "noUncheckedIndexedAccess": true,
    // 强制重写方法时添加 override 关键字(明确标识重写,提升可读性)
    "noImplicitOverride": true,
    // 禁止通过索引签名访问属性(必须用 obj.key 而非 obj['key'],提升类型安全)
    "noPropertyAccessFromIndexSignature": true,
 
    /* -------------------------- 路径别名配置 -------------------------- */
    // 模块解析的基础路径(配合 paths 使用)
    "baseUrl": "./",
    // 路径别名(解决长相对路径问题,如 ../../components → @/components)
    "paths": {
      "@/*": ["src/*"],                // 核心别名:@ 指向 src 根目录
      "@/components/*": ["src/components/*"], // 组件目录别名
      "@/utils/*": ["src/utils/*"],    // 工具函数目录别名
      "@/api/*": ["src/api/*"],        // 接口请求目录别名
      "@/types/*": ["src/types/*"]     // 类型声明目录别名
    },
 
    /* -------------------------- 类型声明配置 -------------------------- */
    // 类型声明文件的根目录(默认 node_modules/@types,扩展自定义类型目录)
    "typeRoots": ["./node_modules/@types", "./src/types"],
    // 指定需要加载的类型声明包(如 node/vite/client/jest)
    "types": ["node", "vite/client"],
    // 禁止从 UMD 模块中访问全局变量(避免全局污染)
    "allowUmdGlobalAccess": false,
 
    /* -------------------------- 编译输出控制 -------------------------- */
    // 编译产物输出目录
    "outDir": "./dist",
    // 源码根目录(保证输出目录结构与源码一致)
    "rootDir": "./src",
    // 生成类型声明文件(.d.ts),组件库/工具库必须开启
    "declaration": true,
    // 类型声明文件的输出目录
    "declarationDir": "./dist/types",
    // 生成类型声明映射文件(方便调试类型)
    "declarationMap": true,
    // 生成 sourceMap 文件(方便调试编译后的代码)
    "sourceMap": true,
    // 将源码内联到 sourceMap 中(生产环境更友好)
    "inlineSources": true,
    // 仅生成类型声明文件,不生成 JS 文件(组件库常用)
    "emitDeclarationOnly": false,
    // 不生成编译产物(仅做类型检查,前端项目配合打包工具使用)
    "noEmit": false,
    // 编译出错时不生成产物(避免错误代码上线)
    "noEmitOnError": true,
 
    /* -------------------------- 性能优化配置 -------------------------- */
    // 启用增量编译(只编译变更的文件,大型项目编译速度提升 50%+)
    "incremental": true,
    // 增量编译的缓存文件路径(放在 node_modules 缓存目录,避免提交到仓库)
    "tsBuildInfoFile": "./node_modules/.cache/tsbuildinfo",
    // 跳过第三方库的类型检查(提升编译速度,避免第三方库类型错误影响项目)
    "skipLibCheck": true,
    // 跳过 TypeScript 内置库的类型检查(进一步提升编译速度)
    "skipDefaultLibCheck": true,
    // 解除编译器的内存大小限制(大型项目避免内存溢出)
    "disableSizeLimit": true,
 
    /* -------------------------- 高级特性配置 -------------------------- */
    // 启用实验性装饰器(Angular/NestJS 常用,普通项目建议关闭)
    "experimentalDecorators": false,
    // 发射装饰器元数据(配合 experimentalDecorators 使用)
    "emitDecoratorMetadata": false,
    // 使用 ES 标准的类字段定义(兼容最新的类语法)
    "useDefineForClassFields": true,
    // 保留 const enum 定义(避免编译后枚举被内联,方便外部使用)
    "preserveConstEnums": true,
    // 不删除代码注释(保留注释便于调试,生产环境可开启)
    "removeComments": false,
    // 允许编译 JS 文件(混合 TS/JS 项目开启)
    "allowJs": false,
    // 检查 JS 文件的类型错误(混合项目开启,纯 TS 项目关闭)
    "checkJs": false
  },
 
  /* ========================== 编译范围控制 ========================== */
  // 需要编译的文件/目录(支持 glob 通配符:* 匹配文件,** 匹配子目录)
  "include": [
    "src/**/*",               // 编译 src 下所有文件(包括子目录)
    "src/**/*.json",          // 编译 src 下的 JSON 文件
    "vite.config.ts",         // 编译构建配置文件
    "build/**/*"              // 编译构建脚本
  ],
  // 排除编译的文件/目录(优先级高于 include)
  "exclude": [
    "node_modules",           // 排除依赖目录(无需编译)
    "dist",                   // 排除输出目录(避免循环编译)
    "build",                  // 排除构建产物目录
    "**/*.test.ts",           // 排除测试文件(由 Jest/Vitest 单独处理)
    "**/*.spec.ts",           // 排除测试规范文件
    "**/*.mock.ts",           // 排除 Mock 文件
    "**/*.stories.tsx"        // 排除组件文档文件
  ],
 
  /* ========================== 配置继承(Monorepo 必备) ========================== */
  // 继承基础配置文件(提取通用配置,避免重复)
  "extends": "./tsconfig.base.json",
 
  /* ========================== 项目引用(多包依赖) ========================== */
  // 引用其他子项目(Monorepo 中实现项目间依赖管理)
  "references": [
    { "path": "../common" },  // 引用 common 子项目
    { "path": "../utils" }    // 引用 utils 子项目
  ]
}

✔ 参考资料:阮一峰《TypeScript 教程》之tsconfig.json项目配置文件

三、模块拆解:逐行解析所有核心配置项

3.1 基础编译配置(必配项)

这类配置是所有项目的基础,决定了编译的核心行为:

配置项

核心作用

企业级使用场景

注释示例代码

target

指定编译后的 JS 版本

前端选 ES2020(兼容现代浏览器),Node 选 ES2020(兼容 Node.js 14+) "target": "ES2020", // 编译为 ES2020,兼容 95% 以上生产环境"
module 指定模块系统 前端用 ESNext(配合打包工具),Node 用 CommonJS "module": "ESNext", // 前端项目使用 ES 模块,由 Vite 处理模块加载"
lib 指定内置类型库 前端需包含 DOM,Node 需包含 ESNext "lib": ["ESNext", "DOM"], // 包含最新 ES 语法 + 浏览器 DOM 类型"

jsx

配置 JSX 编译模式 React 17+ 用 react-jsx,Vue 用 preserve "jsx": "react-jsx", // React 17+ 自动导入 jsx 函数,无需手动引入 React"
moduleResolution 模块解析策略 前端用 Bundler,Node 用 Node "moduleResolution": "Bundler", // 使用 Vite/Webpack 的模块解析逻辑"
esModuleInterop 兼容ES/CommonJS 模块 所有项目必开(解决 React/Lodash 等库的导入问题) "esModuleInterop": true, // 允许 import React from 'react' 而非 import * as React"

3.2 严格类型检查(强烈建议开启)

3.2.1 noImplicitAny
"noImplicitAny": true, // 禁止隐式 any 类型
// 错误示例(开启后报错):
// function add(a, b) { return a + b; } // a/b 隐式为 any
// 正确示例:
// function add(a: number, b: number): number { return a + b; }
3.2.2 strictNullChecks
"strictNullChecks": true, // 严格 null/undefined 检查
// 错误示例(开启后报错):
// const name: string | undefined = undefined;
// console.log(name.toUpperCase()); // 未判断 undefined
// 正确示例:
// const name: string | undefined = undefined;
// console.log(name?.toUpperCase() || '匿名'); // 可选链判断
3.2.3 strictFunctionTypes
"strictFunctionTypes": true, // 严格函数类型检查
// 错误示例(开启后报错):
// type Fn = (a: number) => void;
// const fn: Fn = (a: any) => {}; // 参数类型不匹配
// 正确示例:
// type Fn = (a: number) => void;
// const fn: Fn = (a: number) => {};

3.3 模块解析与路径别名(工程化关键)

路径别名是大型项目的必备配置,以下是完整的配置示例 + 打包工具适配 + 使用示例:

3.3.1 核心配置
"baseUrl": "./", // 模块解析基础路径为项目根目录
"paths": {
  "@/*": ["src/*"], // @ 指向 src 目录
  "@/components/*": ["src/components/*"] // 组件目录别名
},
// 作用:解决长相对路径问题,如 ../../components/Button → @/components/Button
// 优势:路径更简洁、重构更方便、团队规范统一
3.3.2 打包工具适配(Vite 示例)
// vite.config.ts(必须与 tsconfig.json 别名一致,否则运行时找不到模块)
import { defineConfig } from 'vite';
import path from 'path';
 
export default defineConfig({
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'), // 与 tsconfig.json 保持一致
    },
  },
});
3.3.3 使用示例
// 未配置别名时(繁琐且易出错)
import Button from '../../components/Button';
import { formatDate } from '../../utils/date';
 
// 配置别名后(简洁且易维护)
import Button from '@/components/Button';
import { formatDate } from '@/utils/date';

3.4 代码质量与错误校验

这类配置能在编译阶段发现 80% 的低级错误,以下是核心项的详细说明:

3.4.1 noUnusedLocals & noUnusedParameters
"noUnusedLocals": true, // 禁止未使用的局部变量
"noUnusedParameters": true, // 禁止未使用的函数参数
// 错误示例(开启后报错):
// const unusedVar = 123; // 未使用的变量
// function fn(unusedParam: number) { return 1; } // 未使用的参数
// 作用:减少死代码,提升代码整洁度,避免变量冗余
3.4.2 noUncheckedIndexedAccess
"noUncheckedIndexedAccess": true, // 禁止未检查的索引访问
// 错误示例(开启后报错):
// const arr = [1, 2, 3];
// const item = arr[0]; // 未判断数组长度,item 可能为 undefined
// 正确示例:
// const arr = [1, 2, 3];
// const item = arr[0] ?? 0; // 空值合并判断
// 作用:杜绝数组/对象索引访问导致的运行时错误

3.5 类型声明文件配置

3.5.1 typeRoots & types
"typeRoots": ["./node_modules/@types", "./src/types"],
// 作用:指定类型声明文件的查找目录,默认是 node_modules/@types,扩展自定义类型目录
"types": ["node", "vite/client"],
// 作用:只加载指定的类型声明包,避免加载无用类型,提升编译速度
// 场景:Node 项目需加载 node 类型,Vite 项目需加载 vite/client 类型
3.5.2 自定义类型声明示例
// src/types/global.d.ts(自定义全局类型)
declare global {
  interface Window {
    __APP_CONFIG__: {
      apiBaseUrl: string;
      env: 'dev' | 'prod';
    };
  }
}
// 作用:扩展全局对象类型,避免 window.__APP_CONFIG__ 报错

3.6 编译输出控制(产物管理)

这类配置主要用于控制编译产物的生成,不同场景配置差异较大:

3.6.1 前端项目(Vite/Webpack)
"noEmit": true, // 前端项目由打包工具编译,TS 仅做类型检查
// 作用:避免 tsc 生成冗余的 JS 文件,提升开发效率
3.6.2 组件库 / 工具库
"declaration": true, // 生成 .d.ts 类型声明文件
"declarationDir": "./dist/types", // 类型文件输出目录
"emitDeclarationOnly": true, // 仅生成类型文件,JS 文件由打包工具处理
// 作用:提供类型声明,方便使用者获得类型提示
3.6.3 Node.js 项目
"outDir": "./dist", // 输出目录
"rootDir": "./src", // 源码根目录
"sourceMap": true, // 生成 sourceMap,方便调试
// 作用:规范产物目录结构,方便部署和调试

3.7 性能优化 配置(大型项目必备)

大型项目(1000+ 文件)必须开启以下配置,否则编译速度会极慢:

"incremental": true, // 增量编译:只编译变更的文件
"tsBuildInfoFile": "./node_modules/.cache/tsbuildinfo", // 缓存文件路径
"skipLibCheck": true, // 跳过第三方库的类型检查
"skipDefaultLibCheck": true, // 跳过内置库的类型检查
// 性能提升效果:增量编译可使编译时间从分钟级降至秒级,skipLibCheck 可减少 30% 编译时间

3.8 实验性 / 高级特性(场景化使用)

3.8.1 装饰器(Angular/NestJS 专用)
"experimentalDecorators": true, // 启用装饰器
"emitDecoratorMetadata": true, // 发射装饰器元数据
// 使用示例:
// function Log() {
//   return (target: any, key: string) => {
//     console.log(`调用了 ${key} 方法`);
//   };
// }
// class User {
//   @Log()
//   getName() { return '张三'; }
// }

3.8.2 类字段配置

"useDefineForClassFields": true, // 使用 ES 标准的类字段定义
// 作用:兼容最新的类语法,如 class User { name = '张三'; }

四、范围控制:include/exclude/files/extends/references

4.1 include & exclude(编译范围)

"include": [
  "src/**/*", // 编译 src 下所有文件
  "vite.config.ts" // 编译构建配置文件
],
"exclude": [
  "node_modules", // 排除依赖目录
  "dist", // 排除输出目录
  "**/*.test.ts" // 排除测试文件
],
// 通配符说明:
// *:匹配任意文件(不含子目录)
// **:匹配任意子目录
// ?:匹配单个字符
// [abc]:匹配 a/b/c 中的任意一个

4.2 extends(配置继承)

在 Monorepo  项目中,可提取通用配置到 tsconfig.base.json,子项目继承使用:

4.2.1 基础配置文件(tsconfig.base.json)
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ESNext",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true
  }
}
4.2.2 子项目配置文件(src/app/tsconfig.json)
{
  "extends": "../../tsconfig.base.json", // 继承基础配置
  "compilerOptions": {
    "outDir": "../../dist/app", // 子项目输出目录
    "paths": { "@/app/*": ["./*"] } // 子项目专属别名
  }
}

4.3 references(项目引用)

Monorepo 中实现多项目依赖管理,支持增量编译:

"references": [
  { "path": "../common" }, // 引用 common 子项目
  { "path": "../utils" } // 引用 utils 子项目
],
// 编译命令:
// tsc --build // 编译所有引用的项目
// tsc --build packages/common // 编译指定项目
// 作用:实现项目间的依赖隔离,提升编译效率

☑ 注:在软件开发中,Monorepo(单一代码仓库) 是指将多个项目或模块统一管理在一个代码仓库中的架构模式。它与传统的多仓库(Polyrepo)模式形成对比,适用于需要跨项目协作、共享代码或统一维护的场景。


✔ 参考资料 ✔

tsconfig.json完整使用配置介绍和示例 | typeScript 配置文件该怎么写?

TypeScript配置文件tsconfig.json全解析:从基础到进阶 | TypeScript 教程-tsconfig.json 配置

Typescript tsconfig.json全解析 | tsconfig.json配置详解 | tsconfig.json配置详解

更多推荐