2023年tsconfig.json 的最新最全超详细配置

1,041 阅读15分钟

tsconfig.json 文件 说明

  • tsconfig.json 文件 // ts 的类型配置文件 tsconfig.json是ts编译器的配置文件,ts编译器可根据它的信息来对代码进行编译
  • "include"用来指定哪些ts文件需要被编译,数组,可以添加多个 路径:**表示任意目录 *表示任意文件
  • "exclude"不需要被编译的目录,数组,可以添加多个 路径:**表示任意目录 *表示任意文件
  • “extends”:定义被继承的配置文件。
  • “files”:指定被编译文件的列表,只有需要编译的文件少时才会用到,一般直接用include指定文件夹

根选项

  • include:指定被编译文件所在的目录。
  • exclude:指定不需要被编译的目录。
  • extends:指定要继承的配置文件。
  • files:指定被编译的文件。
  • references:项目引用,是 TS 3.0 中的一项新功能,它允许将 TS 程序组织成更小的部分。 使用小技巧:在填写路径时 ** 表示任意目录, * 表示任意文件。

compilerOptions

定义项目的运行时期望、JavaScript 的发出方式和位置以及与现有 JavaScript 代码的集成级别。

项目选项

  • incremental:是否启用增量编译,指再次编译时只编译增加的内容,默认:false。
  • target:指定ts编译成ES的版本。
  • module:指定编译后代码使用的模块化规范。
  • lib:指定项目运行时使用的库。
  • outDir:指定编译后文件所在目录。
  • outFile:将代码编译合并成一个文件,默认将所有全局作用域中的代码合并成一个文件。
  • rootDir:指定输入文件的根目录,默认情况下当前的项目目录为根目录。
  • allowJs:是否对js文件进行编译,默认:false。
  • checkJs:是否检查js代码是否符合语法规范,当使用checkJs,必须使用- allowJs,默认:false。
  • removeComments:是否移除注释,默认:false
  • noEmit:不生成编译后的文件,默认:false。
  • jsx:指定JSX代码生成用于的开发环境。
  • plugins:在编辑器中运行的语言服务插件列表。
  • declaration:是否生成相应的 .d.ts 声明文件,默认:false。
  • declarationMap:是否为每个对应的 .d.ts 文件生成一个 Map 文件,使用该功能时,需要declaration或composite配合一起使用,默认:false。
  • sourceMap:是否生成相应的Map映射的文件,默认:false。
  • composite:是否开启项目编译,开启该功能,将会生成被编译文件所在的目录,同时开启declaration、declarationMap和incremental,默认:false。
  • tsBuildInfoFile:指定增量编译信息文件的位置,使用该功能时,必须开启incremental选项。
  • importHelpers:是否将辅助函数从 tslib 模块导入,默认:false。
  • downlevelIteration:是否用于转换为旧版本的 JS 提供可迭代对象的全面支持,默认:false。
  • isolatedModules:是否将每个文件转换为单独的模块,默认:false。

严格检查

  • strict:是否启动所有严格检查的总开关,默认:false,启动后将开启所有的严格检查选项。
  • alwaysStrict:是否以严格模式解析,并为每个源文件发出"use strict",默认:false。
  • noImplicitAny:是否禁止隐式的any类型,默认:false。
  • noImplicitThis:是否禁止不明确类型的this,默认:false。
  • strictNullChecks:是否启用严格的空检查,默认:false。
  • strictBindCallApply:是否在函数上启用严格的’bind’, 'call’和’apply’方法,默认:false。
  • strictFunctionTypes:是否启用对函数类型的严格检查,默认:false。
  • strictPropertyInitialization:是否启用严格检查类的属性初始化,默认:false。

模块解析选项

  • moduleResolution:指定模块解析策略,node或classic
  • baseUrl:用于解析非绝对模块名的基本目录,相对模块不受影响。
  • paths:用于设置模块名称基于baseUrl的路径映射关系。
  • rootDirs:将多个目录放在一个虚拟目录下,运行编译后文件引入的位置发生改变,也不会报错。
  • typeRoots:指定声明文件或文件夹的路径列表
  • types:用来指定需要包含的模块,并将其包含在全局范围内。
  • allowSyntheticDefaultImports:是否允许从没有默认导出的模块中默认导入,默认:false。
  • esModuleInterop:是否通过为所有导入模块创建命名空间对象,允许CommonJS和ES模块之间的互操作性,开启改选项时,也自动开启- allowSyntheticDefaultImports选项,默认:false。
  • preserveSymlinks:是否不解析符号链接的真实路径,这是为了在 Node.js 中反映相同的标志,默认:false。
  • allowUmdGlobalAccess:允许您从模块文件内部访问作为全局变量的 UMD 导出,如果不使用该选项,从 UMD 模块导出需要一个导入声明,默认:false。

Map选项

  • sourceRoot:指定调试器应定位 TypeScript 文件而不是相对源位置的位置。
  • mapRoot:指定调试器定位Map文件的位置,而不是生成的位置。
  • inlineSourceMap:是否将Map文件内容嵌套到 JS 文件中,这会导致 JS 文件变大,但在某些情况下会很方便,默认:false。
  • inlineSources:是否将 .ts 文件的原始内容作为嵌入字符串包含在 .map 文件中,默认:false。

附加检查

  • noUnusedLocals:是否检查未使用的局部变量,默认:false。
  • noUnusedParameters:是否检查未使用的参数,默认:false。
  • noImplicitReturns:检查函数是否不含有隐式返回值,默认:false。
  • noImplicitOverride:是否检查子类继承自基类时,其重载的函数命名与基类的函数不同步问题,默认:false。
  • noFallthroughCasesInSwitch:检查switch中是否含有case没有使用break跳出,默认:false。
  • noUncheckedIndexedAccess:是否通过索引签名来描述对象上有未知键但已知值的对象,默认:false。
  • noPropertyAccessFromIndexSignature:是否通过" . “(obj.key) 语法访问字段和"索引”( obj["key"]), 以及在类型中声明属性的方式之间的一致性,默认:false。

实验选项

  • experimentalDecorators:是否启用对装饰器的实验性支持,装饰器是一种语言特性,还没有完全被 JavaScript 规范批准,默认:false。
  • emitDecoratorMetadata:为装饰器启用对发出类型元数据的实验性支持,默认:false。

高级选项

  • true:未使用的标签被忽略。
  • false:引发有关未使用标签的编译器错误。
  • assumeChangesOnlyAffectDirectDependencies是否避免重新检查/重建所有真正可能受影响的文件,而只会重新检查/重建已更改的文件以及直接导入它们的文件,默认:false。
  • charset:字符集(已弃用),默认:utf8
  • declarationDir:提供一种方法来配置发出声明文件的根目录。
  • diagnostics:用于输出用于调试的诊断信息
  • disableReferencedProjectLoad:是否禁用所有可用项目加载到内存中,默认:false。
  • disableSizeLimit:为了避免在处理非常大的 JS 项目时可能出现的内存膨胀问题,TS 将分配的内存量有一个上限,默认:false。
  • disableSolutionSearching:在编辑器中搜索查找所有引用或跳转到定义等功能时,禁止包含复合项目,默认:false。
  • disableSourceOfProjectReferenceRedirect:是否禁用项目引用源重定向,默认:false。
  • emitBOM:控制TypeScript在写输出文件时是否发出字节顺序标记(BOM),默认:false。
  • emitDeclarationOnly:是否只发出.d.ts 文件,不发出.js 文件,使用该选项时,需要配合 declaration 或 composite 一起使用,默认:false。
  • explainFiles:解释文件,此选项用于调试文件如何成为编译的一部分,默认:false。
  • extendedDiagnostics:是否查看 TS 在编译时花费的时间,默认:false。
  • forceConsistentCasingInFileNames:是否区分文件系统大小写规则,默认:false。
  • generateCpuProfile:在编译阶段让 TS 发出 CPU 配置文件,只能通过终端或 CLI 调用 --generateCpuProfile tsc-output.cpuprofile 。
  • listEmittedFiles:是否将编译部分生成的文件的名称打印到终端,默认:false。
  • listFiles:是否打印编译文件部分的名称,默认:false。
  • maxNodeModuleJsDepth:在node_modules下搜索并加载JavaScript文件的最大依赖深度,默认:0 。
  • newLine:指定发出文件时要使用的换行规则,CRLF (dos) 或 LF (unix)。
  • noEmitHelpers:是否使用全局作用域助手函数提供实现,并完全关闭助手函数的发出,而不是使用 importhelper 来导入助手函数,默认:false。
  • noEmitOnError:有错误时不进行编译,默认:false。
  • noErrorTruncation:是否禁止截断错误消息,已弃用,默认:false。
  • noImplicitUseStrict:是否禁止无隐式严格模式,默认:false。
  • noLib:是否禁止自动包含任何库文件,默认:false。
  • noResolve:是否禁用析后的文件添加到程序中;默认情况下,TS 会检查 import 和 reference 指令的初始文件集,并将这些解析后的文件添加到你的程序中,默认:false。
  • noStrictGenericChecks:是否禁用严格的泛型检查,默认:false。
  • out:该选项以不可预测或一致的方式计算最终文件位置,已弃用,
  • preserveConstEnums:是否禁止删除枚举常量生成代码中的声明,默认:false。
  • reactNamespace:React命名空间,使用 jsxFactory 来代替。
  • resolveJsonModule:是否解析 JSON 模块,默认:false。
  • skipDefaultLibCheck:是否跳过默认库声明文件的类型检查,默认:false。
  • skipLibCheck:是否跳过声明文件的类型检查,这可以在编译期间以牺牲类型系统准确性为代价来节省时间,默认:false。
  • stripInternal:是否禁止 JSDoc 注释中带有@internal注释的代码发出声明,默认:false。
  • suppressExcessPropertyErrors:是否禁用报告过多的属性错误,默认:false。
  • suppressImplicitAnyIndexErrors:是否抑制隐式any索引的错误,默认:false。
  • traceResolution:当尝试调试未包含模块的原因时。启用该选项让 TypeScript 打印有关每个处理文件的解析过程的信息,默认:false。
  • useDefineForClassFields:此标志用作迁移到即将推出的类字段标准版本的一部分,默认:false。
  • importsNotUsedAsValues:此标志控制如何 import 工作方式,有 3 个不同的选项:remove、preserve 和 error 。
    • jsxFactory:当使用经典的JSX运行时编译JSX元素时,更改.js文件中调用的函数,默认:React.createElement 。
    • jsxFragmentFactory:指定 JSX 片段工厂函数在指定了 jsxFactory 编译器选项的情况下针对 react JSX 发出时使用。
    • jsxImportSource:当在TS 4.1中使用 jsx 作为 react-jsx 或 react-jsxdev 时,声明用于导入jsx和jsxs工厂函数的模块说明符。
    • keyofStringsOnly:当应用具有字符串索引签名的类型时,此标志将类型操作符的键值更改为返回 string 而不是string | number,已弃用,默认:false。

命令行

  • preserveWatchOutput:是否在监视模式下保留过时的控制台输出,而不是每次发生更改时都清除屏幕,默认:false。
  • pretty:是否使用颜色对上下文错误和消息进行样式化,默认:true。

watchOptions

配置 TypeScript 的 --watch工作方式。

监视选项

  • watchFile:监视单个文件的策略,默认:useFsEvents
  • fixedPollingInterval:以固定时间间隔每秒多次检查每个文件的更改。
  • priorityPollingInterval:每秒多次检查每个文件的更改,但使用启发式方法检查某些类型的文件的频率低于其他文件。
  • dynamicPriorityPolling:使用动态队列,其中不经常修改的文件将不那么频繁地检查。
  • useFsEvents:尝试使用操作系统/文件系统的本机事件进行文件更改。
  • useFsEventsOnParentDirectory:尝试使用操作系统/文件系统的本机事件来监听文件父目录的变化。
  • watchDirectory:在缺乏递归文件监视功能的系统下如何监视整个目录树的策略,默认:useFsEvents
  • fixedPollingInterval:以固定时间间隔每秒多次检查每个目录的变化。
  • dynamicPriorityPolling:使用动态队列,其中不经常修改的目录将不那么频繁地检查。
  • useFsEvents:尝试使用操作系统/文件系统的本机事件进行目录更改。
  • fallbackPolling:使用文件系统事件时,此选项指定当系统用完本机文件观察器和/或不支持本机文件观察器时使用的轮询策略,默认:dynamicPriorityPolling
  • fixedPollingInterval:以固定时间间隔每秒多次检查每个文件的更改。
  • priorityPollingInterval:每秒多次检查每个文件的更改,但使用启发式方法检查某些类型的文件的频率低于其他文件。
  • dynamicPriorityPolling:使用动态队列,其中不经常修改的文件将不那么频繁地检查。
  • synchronousWatchDirectory:禁用对目录的延迟监视。
  • synchronousWatchDirectory:在本机不支持递归观看的平台上同步调用回调,并更新目录观察者的状态,默认:false。
  • excludeDirectories:使用排除目录来大幅减少 --watch 期间被监视的文件数量.
  • excludeFiles:使用excludeFiles从被监视的文件中删除一组特定的文件。

typeAcquisition

类型获取仅对 JavaScript 项目很重要。

1. 类型获取

  • enable:提供在 JavaScript 项目中禁用类型获取的配置,默认:false。
  • include:使用 include 来指定应从绝对类型中使用哪些类型。
  • exclude:提供用于禁用 JavaScript 项目中某个模块的类型获取的配置
  • disableFilenameBasedTypeAcquisition:是否禁用基于文件名的类型获取,TypeScript 的类型获取可以根据项目中的文件名推断应该添加哪些类型,默认:false。

详细配置,可评论补充或纠正

{
  // 指定继承自另一个 tsconfig.json 文件
  "extends": "@vue/tsconfig/tsconfig.dom.json",
  // 编译器的选项,如语言版本、目标 JavaScript 版本、生成的 sourcemap 等
  "compilerOptions": {
    /* 基本选项 */
    "rootDir": "./", // 设置项目的根目录
    "outDir": "./dist", // 编译输出目录
    "composite": true,
    "lib": ["esnext", "dom", "dom.iterable"], // 指定要包含在编译中的库文件,如 "es2015"
    "target": "esnext", // 编译目标 JavaScript, 可以是'ES5', 'ES2015'的等
    "module": "esnext", // 指定生成哪个模块系统代码,可以是 "CommonJS","AMD" 或 "System" 等
    "moduleResolution": "bundler", // 决定如何处理模块

    /* Source Map 选项"sourceMap"不能与选项"inlineSourceMap"同时指定 */
    "sourceMap": true, // 生成相应的 .map文件
    "sourceRoot": "", // TypeScript 源代码所在的目录
    "mapRoot": "", // mapRoot用于指定调试器找到映射文件而非生成文件的位置,指定map文件的根路径,该选项会影响.map文件中的sources属性
    // "inlineSourceMap": true, // 生成单个 sourcemaps 文件,而不是将 sourcemaps 生成不同的文件
    "inlineSources": true, // 将代码与 sourcemaps 生成到一个文件中

    "removeComments": false, // 是否移除注释
    "skipLibCheck": true, // 是否跳过检查库文件
    "listEmittedFiles": false, // 是否列出所有输出的文件

    /* 严格的类型检查 */
    "strict": true, // 启用所有严格类型检查选项
    "strictNullChecks": true, // 不允许把 null、undefined 赋值给其他类型变量
    "strictFunctionTypes": true, // 严格检查函数的类型
    "strictBindCallApply": true, // 严格检查 bind、call 和 apply 的参数规则
    "strictPropertyInitialization": true, // 类的实例属性必须初始化
    "noImplicitAny": false, // 是否禁止隐式 any 类型
    "noEmitHelpers": true, // 是否禁止输出辅助函数
    "noEmitOnError": true, // 是否在发生错误时禁止输出 JavaScript 代码
    "noImplicitReturns": true, // 是否禁止隐式返回,每个分支都会有返回值
    "noUnusedLocals": true, // 检查未使用的局部变量
    "noUnusedParameters": true, // 检查未使用的参数
    "noImplicitThis": true, // 不允许 this 有隐式的 any类型
    "noFallthroughCasesInSwitch": true, // 检查 switch 语句包含正确的 break

    /* 模块解析 选项"outFile"不能与选项"isolatedModules"同时指定 */
    "rootDirs": [], // 将多个文件夹放在一个虚拟目录下,合并多个源文件目录
    "isolatedModules": true, // 默认true,控制是否将每个文件作为单独的模块处理
    "esModuleInterop": true, // 通过创建命名空间实现 CommonJS 兼容性
    "resolveJsonModule": true, // 自动解析JSON文件

    "allowImportingTsExtensions": true, // 允许从没有默认导出的模块中导入类型定义(.d.ts)文件
    "allowSyntheticDefaultImports": true, // 允许从没有设置默认导出的模块中默认导入,仅为了类型检查

    /* JS处理 选项"emitDeclarationOnly"不能与选项"noEmit"同时指定;"downlevelIteration"与"importHelpers"一起使用*/
    "noEmit": false, // 是否禁止输出 JavaScript 代码
    "checkJs": true, // 是否检查 JavaScript 文件
    "allowJs": true, // 是否允许编译 JavaScript 文件
    "emitDeclarationOnly": true, // 只生成类型.d.ts声明文件,不生成js, 设置了 emitDeclarationOnly,必须将 declaration 设置为 true
    "useDefineForClassFields": true, // 是否使用 Object.defineProperty 定义类实例属性
    "downlevelIteration": true, // 转译新的语法,以便旧的浏览器也可以支持
    "importHelpers": true, // 默认true,用于控制 TypeScript 是否在编译时自动引入辅助工具函数,以减少生成的 JavaScript 代码大小

    /* TS处理 */
    // "outFile": "./dist/main.js", // ts 生成的所有文件都会保存在单个输出文件中
    "declaration": true, // 是否生成 .d.ts 类型定义文件
    "declarationMap": false, // 为每个 .d.ts 文件生成 sourcemap

    "baseUrl": "./", // 指定基础目录,解析非相对模块名的基准目录
    // 指定模块路径别名
    "paths": {
      "@": ["src"],
      "@/*": ["src/*"]
    },
    "types": ["node"], // types用来指定需要包含的模块,只有在这里列出的模块的声明文件才会被加载进来
    "typeRoots": ["src/types", "node_modules/@types"], // 指定 TypeScript 类型声明文件(.d.ts 文件)的根目录,指定了此项,则只有在这里列出的声明文件才会被加载

    /* jsx tsx 处理 */
    "jsx": "preserve",
    "jsxFactory": "h",
    "jsxFragmentFactory": "Fragment",
    "verbatimModuleSyntax": false,

    /* 实验性 */
    "experimentalDecorators": true, // 启用实验性的装饰器特性
    "emitDecoratorMetadata": true // 为装饰器提供元数据支持
    // "watch": false, // 是否监视文件变化并重新编译
  },
  // 指定要编译的路径列表,包括文件路径或文件夹路径
  "include": ["src/**/*", "src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "test/__tests__"],
  // 指定不需要编译的文件路径或文件夹路径
  "exclude": ["node_modules", "src/**/__tests__/*"],
  "files": [], // 指定文件的相对或绝对路径,编译器在编译的时候只会编译包含在files中列出的文件,如果不指定,则取决于有没有设置include选项,如果没有include选项,则默认会编译根目录以及所有子目录中的文件。这里列出的路径必须是指定文件,而不是某个文件夹,而且不能使用* ? **/ 等通配符
  "references": [], // 一个对象数组,指定要引用的项目
  "buildOnSave": true, // 指定是否在保存时编译文
  "compileOnSave": true // 编辑项目中的文件保存的时候,编辑器会根据tsconfig.json中的配置是否重新生成文件
}