TypeScript 配置文件 tsconfig.json 备忘单

{
  "compilerOptions": {
    /* 基础配置: */
    "esModuleInterop": true,
    "skipLibCheck": true,
    "target": "es2022",
    "allowJs": true,
    "resolveJsonModule": true,
    "moduleDetection": "force",
    "isolatedModules": true,
    "verbatimModuleSyntax": true,
 
    /* 严格模式 */
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "noImplicitOverride": true,
 
    /* 如果使用 TypeScript 进行转译: */
    "module": "NodeNext",
    "outDir": "dist",
    "sourceMap": true,
 
    /* 如果你在为库建造: */
    "declaration": true,
 
    /* 如果是在 monorepo 仓库中进行lib构建: */
    "composite": true,
    "declarationMap": true,
 
    /* 如果不使用 TypeScript 进行转译: */
    "module": "preserve",
    "noEmit": true,
 
    /* 如果您的代码在DOM中运行: */
    "lib": ["es2022", "dom", "dom.iterable"],
 
    /* 如果你的代码无法在 DOM 中运行: */
    "lib": ["es2022"]
  }
}

适用于所有项目的基本设置

{
  "compilerOptions": {
	/* 帮助修复 CommonJS 和 ES模块之间的一些缺陷 */
    "esModuleInterop": true,
    /* 跳过检查文件类型 .d.ts。这对于性能很重要,否则 node_modules 将检查所有内容 */
    "skipLibCheck": true,
    /* 目标的 JavaScript 版本。为了稳定,建议 es2022 使用以上版本 esnext */
    "target": "es2022",
    /* 允许导入 .js 和 .json 文件 */
    "allowJs": true,
    "resolveJsonModule": true,
    /* 此选项强制 TypeScript 将所有文件视为模块/。这有助于避免 “无法重新声明块范围变量” 的错误 */
    "moduleDetection": "force",
    /* 此选项可防止一些将模块视为独立文件时不安全的 TS 功能 */
    "isolatedModules": true,
    /* 此选项强制您使用 import type 和 export type 从而实现更加可预测的行为和更少的不必要的导入/使用 module: NodeNext,它还会强制您使用正确的 ESM或者CJS导入语法 */
    "verbatimModuleSyntax": true
  }
}

严格模式选项

{
  "compilerOptions": {
	/* 启用所有严格类型检查选项,不可或缺 */
    "strict": true,
    /* 组织您访问数组或对象,除非先检查其是否已定义。这是防止运行时错误的好方法,应该设置 */
    "noUncheckedIndexedAccess": true,
    /* 使 overriede 关键字真正有用 */
    "noImplicitOverride": true
  }
}

使用 TypeScript 进行转义

{
  "compilerOptions": {
	 /* 告诉 TypeScript 使用什么模块语法。 NodeNext 是 Node的最佳选项 */
    "module": "NodeNext",
    /* 告诉 TypeScript 将编译后的 JavaScript 文件放在哪里 */
    "outDir": "dist"
  }
}

Lib 构建

如果你想构建一个 lib

{
  "compilerOptions": {
	/* 告诉 TypeScript 发出 .d.ts 文件,这是必须的,以便lib 可以自动完成 .js  */
    "declaration": true
  }
}

在 Monorepo 中构建 Lib

{
  "compilerOptions": {
    /*  */
    "declaration": true,
    /* 告诉 TypeScript 发出 .tsbuildinfo 文件。这会告诉 TypeScript 您的项目是 monorepo 的一部分,并且它还帮助它缓存构建以加快运行速度 */
    "composite": true,
    /* 告诉 TypeScript 构建出源码映射和声明映射,这是必须的。当您的库进行调试时,他们可以使用转到定义跳转到原始代码 */
    "sourceMap": true,
    /* 声明映射:同上 */
    "declarationMap": true
  }
}

不使用 TypeScript 进行转义

如果你没有使用 tsc 来转换代码。即使 TypeScript 作为 linter。那么你会需要下面的选项

{
  "compilerOptions": {
	/* preserve 是最好的选择,因为它最接近的模仿了捆绑器处理模块的方式。 */
    "module": "preserve",
    /* 告诉 TypeScript 不要输出任何文件,当你使用捆绑器时,这很重要,这样你就不会输出无用的 js 文件 */
    "noEmit": true
  }
}

在 DOM 中运行

{
  "compilerOptions": {
    /* 告诉 TypeScript 要包含哪些内置类型,es2022 是最稳定的选择, dom 和 dom.iterable 为你提供 window, document 类型 */
    "lib": ["es2022", "dom", "dom.iterable"]
  }
}

不在 DOM 中运行

{
  "compilerOptions": {
    "lib": ["es2022"]
  }
}

参考