跳到主要内容

TypeScript tsconfig.json 配置速查 — 55+ 个编译器选项附默认值与示例

TypeScript tsconfig.json 速查,55+ 个选项附默认值、示例和注意事项。

  • 本地处理
  • 分类 开发运维
  • 适合 格式化、校验、压缩或检查和代码相关的文本。
分类:
51 个选项
类型检查(15)
strictboolean默认: false

总开关,一次性启用七个严格检查:noImplicitAny、strictNullChecks、strictFunctionTypes、strictBindCallApply、strictPropertyInitialization、noImplicitThis 和 useUnknownInCatchVariables。新项目必开。老项目用 `// @ts-nocheck` 逐文件迁移。

"strict": true

⚠ 注意 在大型老项目里开启 strict 可能一下冒出几千个错误。迁移期间在最嘈杂的文件顶部加 `// @ts-nocheck`,而不是逐行压制。

noImplicitAnyboolean默认: false (true with strict)

当 TS 因缺少类型信息而推断出 `any` 时报错。最常见触发场景是未注解的函数参数:` function foo(x)` 会报错,必须写 `function foo(x: string)`。

"noImplicitAny": true
strictNullChecksboolean默认: false (true with strict)

让 `null` 和 `undefined` 成为独立类型,不再能赋给任何类型。没这个 flag 时,忘记处理 null 是静默 bug。开了之后必须显式检查、用非空断言(`!`),或在联合类型里包含 `null`。

"strictNullChecks": true

⚠ 注意 迁移时最常漏掉的是给可能返回空的函数的返回类型补 `| null | undefined`。

strictFunctionTypesboolean默认: false (true with strict)

对回调位置的函数参数类型强制逆变检查。能捕获一类微妙 bug:传入的函数只接受比回调期望的更窄的类型。方法声明(非箭头函数)依然按双变处理以保持兼容性。

"strictFunctionTypes": true
strictBindCallApplyboolean默认: false (true with strict)

对 `bind`、`call`、`apply` 的参数进行严格类型检查。没开时这些方法接受任意 `any` 参数,开了才能根据函数签名正确校验。

"strictBindCallApply": true
strictPropertyInitializationboolean默认: false (true with strict)

对类中声明但未在构造函数里初始化的属性报错。需要同时开 `strictNullChecks`。只有在真正能保证构造函数外初始化顺序时(如依赖注入)才用确定赋值断言(`!`)。

"strictPropertyInitialization": true

⚠ 注意 不要把每个属性都加 `!` 来压掉报错,那样等于没开这个检查。只在生命周期钩子或框架注入初始化的属性上用。

noImplicitThisboolean默认: false (true with strict)

当 `this` 隐式为 `any` 类型时报错。常见于 TS 无法判断 `this` 类型的独立函数和对象字面量里。修复方法:在函数签名中加 `this: ClassName` 参数。

"noImplicitThis": true
useUnknownInCatchVariablesboolean默认: false (true with strict)TS 4.0

让 `catch` 子句的错误变量类型变为 `unknown` 而不是 `any`。强制在访问前先收窄类型,因为 `throw` 可以抛任何值,不只是 `Error` 实例。

"useUnknownInCatchVariables": true

⚠ 注意 用 `if (error instanceof Error)` 或类型守卫处理,不要不加检查直接 `as Error`,因为 `throw "字符串"` 是合法的 JavaScript。

noUnusedLocalsboolean默认: false

对声明了但从未使用的局部变量报错。故意不用的变量用 `_` 前缀(如回调里的 `_index`)可压制报错而无需删除。

"noUnusedLocals": true
noUnusedParametersboolean默认: false

对声明了但从未使用的函数参数报错。和 `noUnusedLocals` 一样,用 `_` 前缀标记故意不用的参数。

"noUnusedParameters": true
noImplicitReturnsboolean默认: false

当非 void 函数中并非所有代码路径都有 `return` 时报错。防止复杂 if/else 链里漏掉 else 分支的 return 这类经典 bug。

"noImplicitReturns": true
noFallthroughCasesInSwitchboolean默认: false

对 switch 里非空且未用 `break`/`return`/`throw` 结束而落空到下一个 case 的情况报错。多个空 case 连写(如 `case X: case Y:`)仍然允许。

"noFallthroughCasesInSwitch": true
exactOptionalPropertyTypesboolean默认: falseTS 4.4

区分"属性不存在"和"属性被显式设为 undefined"。可选属性 `x?: string` 只允许赋字符串或完全省略 `x`,把 `obj.x = undefined` 写进去是错误。这是最精确的可选属性建模。

"exactOptionalPropertyTypes": true

⚠ 注意 很多老代码用 `obj.x = undefined` 来"清除"属性。开了这个 flag 必须改为 `delete obj.x`,或把类型改成 `x?: string | undefined`。

noUncheckedIndexedAccessboolean默认: falseTS 4.1

在数组下标访问和索引签名访问的返回类型里加入 `undefined`。因为 `arr[5]` 可能越界,TS 要求访问前先检查 `arr[5] !== undefined`。能抓到一类非常常见的运行时错误。

"noUncheckedIndexedAccess": true

⚠ 注意 `strict` 不会自动开这个,要手动选择。在大量操作数组的代码里会比较吵。确定下标一定存在时用 `arr[i]!`(非空断言)。

noPropertyAccessFromIndexSignatureboolean默认: false

要求通过索引签名定义的属性必须用方括号(`obj["key"]`)而非点符号(`obj.key`)访问。让"安全"访问(已声明属性)和"动态"访问(索引签名)在视觉上一目了然。

"noPropertyAccessFromIndexSignature": true
模块(8)
modulestring默认: "CommonJS" (for ES3/ES5 target)

控制 TS 生成什么模块格式。`"CommonJS"` 生成 `require()/module.exports`(传统 Node)。`"ESNext"` 生成 `import/export`(打包器用)。`"NodeNext"` 开启完整 Node.js ESM,导入路径需加 `.js` 扩展名。

"module": "NodeNext"

⚠ 注意 Vite/webpack 项目:用 `"ESNext"` + `"moduleResolution": "bundler"`。Node.js ESM:两个都用 `"NodeNext"`。永远不要把 `"ESNext"` module 和 `"node10"` resolution 混用。

moduleResolutionstring默认: "node10" for CommonJS moduleTS "bundler" added in 5.0

决定 TS 怎么查找模块文件。`"bundler"`(TS 5.0+)匹配 Vite/esbuild 等现代打包器,不需要文件扩展名。`"NodeNext"` 对应 Node.js 12+ 解析规则,需要 `.js` 扩展名。`"node10"` 是旧版 Node.js 解析策略。

"moduleResolution": "bundler"
resolveJsonModuleboolean默认: false

允许导入 `.json` 文件并根据 JSON 结构自动推断类型。用于直接在 TS 里导入配置文件、本地化字符串或静态数据集非常方便。

"resolveJsonModule": true

⚠ 注意 大 JSON 文件会被完整类型检查并打包,可能拖慢编译并增大包体积。超大数据文件考虑运行时再加载。

allowImportingTsExtensionsboolean默认: falseTS 5.0

允许在 import 语句里显式写 `.ts`、`.tsx`、`.mts` 扩展名。要求同时开 `noEmit` 或 `emitDeclarationOnly`,因为 TS 不知道如何处理输出 JS 里的 `.ts` 扩展名。

"allowImportingTsExtensions": true
allowJsboolean默认: false

让 TS 在处理 `.ts` 文件的同时也处理 `.js` 和 `.jsx` 文件。逐步把 JS 项目迁移到 TS 时很有用,可以一次转换一个文件,不需要全部改名。

"allowJs": true
checkJsboolean默认: false

对 `.js` 文件开启类型检查(需要同时开 `allowJs`)。TS 利用类型推断和 JSDoc 注解检查 JavaScript。在 JS 代码库里引入 TS 时的好起点,不必一开始就写 TS 类型注解。

"checkJs": true
verbatimModuleSyntaxboolean默认: falseTS 5.0

强制纯类型导入用 `import type`,纯类型导出用 `export type`;导入类型时不加 `type` 关键字会报错。确保类型导入在编译时被移除,无需 Babel 等工具。替代了 `importsNotUsedAsValues`。

"verbatimModuleSyntax": true

⚠ 注意 需要给所有现有纯类型导入加 `type`,如 `import { Foo }` 改为 `import type { Foo }`。多数编辑器可以通过快速操作自动修复。

moduleDetection"auto" | "legacy" | "force"默认: "auto"TS 4.7

控制 TS 怎么判断一个文件是模块还是脚本。`"auto"`:有 `import`/`export` 或 `import.meta` 的文件是模块。`"force"`:所有非声明文件都当模块处理,有助于防止意外的全局声明。

"moduleDetection": "force"
输出(12)
targetstring默认: "ES3"

设置 TS 生成的 JS 语言版本。现代项目用 `"ES2022"` 或 `"ESNext"`。影响语法转换(async/await、可选链)和通过 `lib` 可用的内置类型。target 与实际运行环境不匹配会导致微妙错误。

"target": "ES2022"

⚠ 注意 target 设得比实际运行环境高会导致运行时错误。比如 `"ES2022"` 但在 Node 12 上跑,`Array.at()` 等方法不存在。

libstring[]默认: depends on target

指定要包含的内置 API 类型声明。不填时 TS 根据 `target` 自动选择。常见补充:`"DOM"` 加浏览器 API,`"DOM.Iterable"` 加可迭代 DOM 集合。Node.js 项目里去掉 `"DOM"` 避免浏览器类型混入。

"lib": ["ES2022", "DOM", "DOM.Iterable"]
outDirstring默认: (beside source files)

指定编译后文件的输出目录。TS 在 `outDir` 里复现源文件的目录结构。与 `rootDir` 配合使用以得到可预期的输出布局。记得把 `outDir` 加到 `.gitignore`。

"outDir": "./dist"
rootDirstring默认: (inferred from input files)

指定 TS 源文件的根目录。与 `outDir` 配合计算输出路径,`rootDir` 下的目录结构会在 `outDir` 里复现。如果 TS 推断错了,显式设为 `"./src"`。

"rootDir": "./src"
declarationboolean默认: false

在编译输出的 `.js` 文件旁边生成 `.d.ts` 类型声明文件。发布 TypeScript 库时必须开启。配合 `emitDeclarationOnly` 可以只输出类型文件不输出 JS。

"declaration": true
declarationMapboolean默认: false

在 `.d.ts` 旁边生成 `.d.ts.map` 文件。让编辑器"跳转到定义"时跳到原始 `.ts` 源文件而非 `.d.ts`。对能访问源码的库使用者来说大幅改善开发体验。

"declarationMap": true
sourceMapboolean默认: false

生成 `.js.map` 源映射文件,将编译后的 JS 映射回原始 TS。让调试器和错误报告工具(Sentry 等)显示 TS 行号而非编译后的 JS 行号。生产环境调试必备。

"sourceMap": true
noEmitboolean默认: false

只运行类型检查,不向磁盘写任何输出文件。打包器(Vite、esbuild、webpack)负责编译时的理想配置,TS 只做类型检查。配合 `isolatedModules: true` 可获得最快的类型检查速度。

"noEmit": true
emitDeclarationOnlyboolean默认: false

只生成 `.d.ts` 类型文件,不生成 `.js`。发布库时的理想配置:TS 通过 `tsc` 生成类型,打包器生成 JavaScript。需要同时开 `declaration: true`。

"emitDeclarationOnly": true
removeCommentsboolean默认: false

从生成的 JS 里删掉所有注释。不影响 `.d.ts` 类型声明文件。TS 源码里有大量 JSDoc 注释但想减小输出体积时有用。三斜杠引用指令(`/// <reference>`)始终保留。

"removeComments": true
importHelpersboolean默认: false

从 `tslib` 导入辅助函数(`__awaiter`、`__extends`、`__assign` 等)而不是在每个文件里内联生成。当大量文件用到同一个辅助函数时能减小总包体积。需要把 `tslib` 加为依赖。

"importHelpers": true
downlevelIterationboolean默认: false

编译到 ES5/ES3 时对可迭代对象(for...of、展开、解构)生成正确的迭代代码。没开时 TS 用简单但不正确的实现。配合 `importHelpers: true` + `tslib` 避免每个文件都内联迭代器辅助函数。

"downlevelIteration": true
互操作(7)
esModuleInteropboolean默认: false

开启 CommonJS 和 ES 模块 `import` 语法的互操作性。没开时 `import React from "react"` 对只导出 `module.exports` 的模块会失败。开了之后 TS 加辅助代码让默认导入对 CJS 模块也能用。自动启用 `allowSyntheticDefaultImports`。

"esModuleInterop": true

⚠ 注意 这会添加运行时辅助函数(`__importDefault`、`__importStar`)。配合 `importHelpers: true` + `tslib` 统一导入,避免每个文件都生成一份。

allowSyntheticDefaultImportsboolean默认: true when esModuleInterop is enabled

当模块没有显式 `export default` 时允许 `import Foo from 'module'` 写法。这是纯类型检查 flag,不生成任何运行时代码。开了 `esModuleInterop` 会自动启用。同时需要运行时行为时用 `esModuleInterop`。

"allowSyntheticDefaultImports": true
isolatedModulesboolean默认: false

确保每个文件都能在不依赖其他文件类型信息的情况下独立转译。使用 Babel、esbuild 或 SWC 编译 TS 时必须开启。对只在完整类型信息下才能工作的特性报错:`const enum`、非类型重导出、外部模块声明。

"isolatedModules": true

⚠ 注意 `const enum` 完全不允许,改用普通 `enum` 或 const 对象。所有纯类型导入必须用 `import type` 确保正确移除。

forceConsistentCasingInFileNamesboolean默认: false

要求所有导入使用被引用文件名的确切大小写。防止只在大小写敏感文件系统(Linux)上出现而在 macOS/Windows 上不报错的 bug。能抓到 `import Foo from "./foo"` 但实际文件是 `Foo.ts` 这类问题。

"forceConsistentCasingInFileNames": true
skipLibCheckboolean默认: false

跳过所有 `.d.ts` 类型声明文件(包括 npm 包里的)的类型检查。防止第三方类型定义不正确或相互冲突导致的错误。显著加快编译速度。几乎所有应用项目都推荐开启。

"skipLibCheck": true

⚠ 注意 这也会跳过你自己的 `.d.ts` 文件。维护库时在库本身的 tsconfig 里保持 `false`,在使用者的 app 里用 `true`。

experimentalDecoratorsboolean默认: false

启用对旧版装饰器语法(Stage 2 装饰器,TS 原始实现)的支持。Angular、NestJS、TypeORM 等框架必须开启。注意:TS 5.0 已单独添加了对 TC39 官方装饰器标准的支持。

"experimentalDecorators": true
emitDecoratorMetadataboolean默认: false

为带有装饰器的声明生成设计时类型元数据。使用反射的依赖注入容器(NestJS、InversifyJS)必须开启。需要同时开 `experimentalDecorators: true` 以及运行时引入 `reflect-metadata` polyfill。

"emitDecoratorMetadata": true
JSX(3)
jsxstring默认: undefined (must be set for JSX)

控制 JSX 语法如何转换。`"react-jsx"`(React 17+):使用自动运行时,无需每个文件都 `import React`。`"react"`(旧版):每个 JSX 文件都需要 `import React`。`"preserve"`:保留 JSX 让打包器处理。`"react-native"`:和 preserve 一样但输出 `.js` 扩展名。

"jsx": "react-jsx"
jsxImportSourcestring默认: "react"TS 4.1

指定使用 `"jsx": "react-jsx"` 时从哪个模块导入 `jsx` 和 `jsxs` 工厂函数。Preact 用 `"preact"`,SolidJS 用 `"solid-js"`,Vue 3 用 `"vue"` 等。可以用 `/** @jsxImportSource preact */` 在单个文件里覆盖。

"jsxImportSource": "preact"
jsxFactorystring默认: "React.createElement"

使用 `"jsx": "react"` 旧版转换时指定 JSX 元素创建函数。Preact 改为 `"h"`,React 默认是 `"React.createElement"`。使用新版 `"react-jsx"` 转换时此选项无关。

"jsxFactory": "h"
路径(3)
baseUrlstring默认: undefined

设置解析非相对模块名的基础目录。设为 `"."` 或 `"./src"` 后,可以写 `import Button from "components/Button"` 而不是一串 `../../`。通常与 `paths` 配合使用。

"baseUrl": "."

⚠ 注意 TS 只处理类型解析那一侧。打包器(Vite 的 `resolve.alias`、webpack 的 `resolve.alias`)也需要配置对应别名,运行时才能实际解析到正确文件。

pathsRecord<string, string[]>默认: undefined

将模块名模式映射到文件位置。启用 `@/*` → `./src/*` 这类路径别名。每个模式映射到一组备用路径。需要同时设置 `baseUrl`。

"paths": { "@/*": ["./src/*"] }

⚠ 注意 `paths` 只影响类型检查,TS 不会改写输出 JS 里的导入路径。必须在打包器里配置对应别名才能在运行时正确解析。

rootDirsstring[]默认: undefined

让 TS 把多个目录当成合并成一个虚拟根目录来处理。在 monorepo 或多目录在运行时合并的构建系统中很有用。允许这些目录之间进行相对路径导入。

"rootDirs": ["./src", "./generated"]
项目(3)
compositeboolean默认: false

启用项目引用,让 `tsc --build` 在多包仓库里只重新构建发生变化的包。要求 `declaration: true`,并创建 `.tsbuildinfo` 缓存文件。TypeScript monorepo 增量构建的基础。

"composite": true
incrementalboolean默认: true when composite; otherwise false

把构建信息保存到 `.tsbuildinfo` 文件,后续构建跳过未改变的文件。在大型项目里显著加快 TS 编译速度。记得把 `.tsbuildinfo` 加到 `.gitignore`。

"incremental": true
tsBuildInfoFilestring默认: ".tsbuildinfo" in outDir

指定 `.tsbuildinfo` 增量构建缓存文件的路径。同时构建多个 tsconfig 可能写到相同默认位置时需要修改,或者要把缓存存到 CI 特定目录时也用到。

"tsBuildInfoFile": "./.tsbuildinfo"

这个工具能做什么

涵盖 tsconfig.json 所有重要编译器选项的可搜索参考手册,按日常使用的 七大类整理。类型检查: strict(总开关)、noImplicitAny、strictNullChecks、 strictFunctionTypes、strictBindCallApply、strictPropertyInitialization、 noImplicitThis、useUnknownInCatchVariables、noUnusedLocals、 noUnusedParameters、noImplicitReturns、noFallthroughCasesInSwitch、 exactOptionalPropertyTypes(TS 4.4)、noUncheckedIndexedAccess(TS 4.1)、 noPropertyAccessFromIndexSignature。模块:module(CommonJS / NodeNext / ESNext)、moduleResolution(bundler、NodeNext、node10)、resolveJsonModule、 allowImportingTsExtensions(TS 5.0)、allowJs、checkJs、verbatimModuleSyntax (TS 5.0)、moduleDetection(TS 4.7)。输出:target、lib、outDir、rootDir、 declaration、declarationMap、sourceMap、noEmit、emitDeclarationOnly、 removeComments、importHelpers、downlevelIteration。互操作:esModuleInterop、 allowSyntheticDefaultImports、isolatedModules、forceConsistentCasingInFileNames、 skipLibCheck、experimentalDecorators、emitDecoratorMetadata。JSX:jsx (react-jsx / preserve / react-native)、jsxImportSource。路径:baseUrl、 paths、rootDirs。项目:composite、incremental、tsBuildInfoFile。每条都标明 类型、默认值、中英双语说明、可直接拷贝的 JSON 片段,有坑的附带注意事项。 搜索框跨选项名/说明/片段/注意事项同时过滤,分类胶囊可锁定任意单组。 完全浏览器里跑,离线可用,公司代理后面也没问题。

工具细节

输入
文本
页面会根据工具类型展示文本框、数值控件、文件选择或结构化输入。
输出
即时结果 + 复制 + 预览
结果区优先给出可操作结果,支持项会显示复制、下载或可视化预览。
隐私
浏览器本地处理
主工具逻辑未发现外部 API 调用,输入通常留在当前标签页内处理。
保存 / 分享
可分享链接状态
关键设置会进入 URL,复制链接后别人能复现同一组参数。
性能预算
首屏 JS ≤ 30 KB
没有声明 WASM 依赖,适合快速打开和移动端使用。
适用场景
开发运维 · 程序员
分类和职业标签用于推荐相关工具、组织内链,并帮助用户快速判断是否适合当前任务。

怎么用

  1. 1. 输入

    把内容粘贴或拖入工具面板。

  2. 2. 处理

    点击按钮,在浏览器内本地处理,文件不上传。

  3. 3. 复制 / 下载

    一键复制结果或下载到本地。

TypeScript 配置速查 适合怎么用

适合穿插在写代码、查问题、做 Review、上线前的小任务里。

适合开发场景

  • 格式化、校验、压缩或检查和代码相关的文本。
  • 把片段整理好再放进文档、工单、提交或交接材料。
  • 不切换工具,快速检查一个小 payload。

开发检查项

  • 压缩、混淆这类不可逆处理,先对副本操作。
  • 除非确认工具本地处理,不要粘贴密钥和敏感片段。
  • 转换后的代码上线前,仍要跑自己的测试或 lint。

下一步可以接着做

这些入口会把当前任务接到更完整的工具链里。

  1. 1 TypeScript 速查表 TypeScript 速查表,100+ 段代码涵盖类型/泛型/工具类型/类型收窄/异步模式。 打开
  2. 2 npm / yarn / pnpm 命令速查 npm / yarn / pnpm 命令速查,80+ 条覆盖 init/install/scripts/publish,三个工具对照表。 打开
  3. 3 package.json 速查表 package.json 字段速查,55+ 字段配真实示例,双语可搜索。 打开

真实使用场景

  • 在新项目上配严格类型检查

    你在启动新的 TypeScript 项目,想开所有严格检查但记不住每个单独的 flag。 速查里一眼看到 `"strict": true` 一次开七个,并清楚解释了每个子 flag 能 抓到什么问题,让你明白为什么 strictNullChecks 必须手动处理 null,为什么 exactOptionalPropertyTypes 比它还严。

  • 给 Vite + React 项目配 TypeScript

    新 Vite 项目的 tsconfig 模板一堆看不懂的选项。你查了 `moduleResolution: bundler`,知道这是 Vite 必须用的;查到 `noEmit: true` 是正确的,因为 Vite 负责编译;确认 `allowImportingTsExtensions` 能让你直接导入 `.ts` 文件。

  • 发布带完整类型支持的 npm 库

    你想让库的使用者用起来有类型提示。速查里看到 `declaration: true` 生成他 们需要的 `.d.ts` 文件,`declarationMap: true` 让他们能跳转到你的 TS 源码, `emitDeclarationOnly: true` 意味着 TS 负责类型,打包器负责 JavaScript。

  • 排查"找不到模块"或"路径别名不生效"的问题

    `@/` 别名在 Vite 里能用,但 TypeScript 报"Cannot find module"。你查 `paths` 看到那条注意事项:TS 只处理类型检查那一侧,打包器也要配对应别名。你给 vite.config.ts 加 `resolve.alias`,报错消失了。

常见踩坑

  • Vite/esbuild 项目还用 `"moduleResolution": "node"` — 对带 `exports` 字段的包会产生微妙的找不到模块错误。改用 `"bundler"`。

  • tsconfig 里配了 `paths` 但打包器没配对应别名 — TS 不报错,但运行时崩溃。

  • `noEmit: true` 和 `emitDeclarationOnly: true` 同时开 — `noEmit` 优先,什么都不输出。两个选一个。

常见问题

类似工具组合

做你这行的人, 还会一起用这些。

Made by Toolora · 100% client-side · Updated 2026-07-01