tsconfig.json 生成器

结果

tsconfig.json 的编译器选项远超一百个,而每篇 TypeScript 教程给出的组合都不一样。这个生成器只聚焦对多数项目真正重要的部分:target、module、moduleResolution、jsx、常用布尔开关(strict、esModuleInterop、skipLibCheck 等),以及 outDir/rootDir 两个目录。每次修改选项,tsconfig.json 预览都会实时更新;把它复制到项目根目录,你就得到一份干净的配置,没有多数模板夹带的那些无用选项。

配置的生成方式

  1. 1

    选择 target 和 module

    tsc 输出的 JavaScript 版本(ES2015 到 ES2023,或 ESNext),以及模块系统(CommonJS、ES2015/ES2020/ES2022、ESNext、Node16、NodeNext)。

  2. 2

    确定 moduleResolution 和 JSX

    Vite/webpack 项目选 bundler,现代 Node 选 node16/nodenext,老旧环境选 node 或 classic。现代 React 把 jsx 设为 react-jsx,保持 none 则不写入该键。

  3. 3

    切换各个开关

    strict、esModuleInterop、skipLibCheck、resolveJsonModule、allowJs、declaration、sourceMap 和 forceConsistentCasingInFileNames,都是简单的复选框。

  4. 4

    设置目录

    outDir 和 rootDir 预填为 ./dist 和 ./src。include 与 exclude 固定为 src/**/* 加上 node_modules 和 dist。

  5. 5

    复制生成的 tsconfig

    JSON 预览实时更新;点击一下即可复制,放到项目根目录作为 tsconfig.json 即可。

这个生成器会写出的选项

选项 此处默认值 作用
target ES2022 输出代码的 JavaScript 版本。ES2022 对当前浏览器和 Node 都安全;只有面向老旧环境才需要更低的 target。
module ESNext 输出的模块语法。Node ESM 项目用 NodeNext/Node16,老式 Node 用 CommonJS。
moduleResolution node 决定 import 如何被定位。配合 Vite/webpack/esbuild 首选 bundler,现代 Node 用 node16/nodenext;node(node10)是历史行为。
jsx 不写入 只有选定模式时才会写入。React 17+ 用 react-jsx,由打包器转换 JSX 时用 preserve。
strict true 一次性开启整个 strict 检查家族。新项目请保持开启。
esModuleInterop true 修复从 CommonJS 包做默认导入的问题。
skipLibCheck true 跳过 .d.ts 文件的类型检查;编译明显更快,极少掩盖真实 bug。
forceConsistentCasingInFileNames true 拒绝大小写与磁盘文件不一致的导入(从 macOS 迁到 Linux 时的经典翻车点)。
resolveJsonModule true 允许 import data from "./data.json"。
allowJs false 允许 .js 文件参与编译;迁移过程中很有用。
declaration false 生成 .d.ts 文件;发布库时开启。
sourceMap false 生成 .js.map 文件用于调试。
outDir / rootDir ./dist / ./src 编译产物的去向和源码所在位置。
baseUrl "." 始终写入,这样你手动补充的 paths 块会从项目根目录解析。

默认输出,一字不差

所有控件保持原样,你得到的就是这份文件:

{
    "compilerOptions": {
        "target": "ES2022",
        "module": "ESNext",
        "moduleResolution": "node",
        "strict": true,
        "esModuleInterop": true,
        "skipLibCheck": true,
        "forceConsistentCasingInFileNames": true,
        "resolveJsonModule": true,
        "allowJs": false,
        "declaration": false,
        "sourceMap": false,
        "outDir": "./dist",
        "rootDir": "./src",
        "baseUrl": "."
    },
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules",
        "dist"
    ]
}

只要给 jsx 选了 none 以外的模式,compilerOptions 里就会追加一条 "jsx"。

严格模式究竟开启了什么

strict: true 是一个总开关,一次性启用整个 strict 家族,包括 noImplicitAny、strictNullChecks、strictFunctionTypes、strictBindCallApply、strictPropertyInitialization、noImplicitThis、useUnknownInCatchVariables 和 alwaysStrict。新项目应该全部开着起步:事后补严格性非常痛苦。

常见错误

  • 给 Node ESM 项目设置 module: "CommonJS"。 如果你的 package.json 写着 "type": "module",module 和 moduleResolution 都应使用 NodeNext。
  • 把 tsc 当打包器用。 它是编译器和类型检查器。构建交给 Vite/esbuild/SWC,类型检查用 tsc --noEmit。
  • 什么都编译。 没有 include 列表时,TypeScript 会把看得见的每个 .ts 都收进来。生成的配置始终写入 include: ["src/**/*"] 并排除 node_modules 和 dist,这点不用操心。
  • 需要的比配置提供的更多。 这个生成器有意保持精简。lib、paths、isolatedModules、noEmit 之类的选项,等基础文件就位后手动加上即可。

常见问题

monorepo 和多包项目应该:用一个包含公共选项的基础文件,各包通过 “extends” 继承。单项目仓库则用一份像生成结果这样的 tsconfig.json 更简单。

TypeScript 5.0 为使用 Vite、webpack 或 esbuild 构建的项目引入。它还原了打包器实际解析 import 的方式,不带 node16/nodenext 那套 ESM 文件扩展名规则。由 Node 直接执行的代码,请选 node16 或 nodenext。

没有专门的控件。不过生成的文件总是把 baseUrl 设为 “.”,你可以紧挨着它粘贴一个 paths 块,例如 “@/*”: [“src/*”],它会从项目根目录解析。

通常不需要,这也是生成器不写它的原因:target 会隐式确定一套匹配的库类型。只有特殊情况才手动覆盖 lib,比如 Node 项目里要用 DOM API,或需要 WebWorker 类型。

无需注册,也不会保存任何内容。你的选择只用于渲染配置预览;在分步视图中它们还会随页面 URL 传递,方便收藏或分享一份配置。

相关工具

此工具还提供其他语言版本