Nealyang / PersonalBlog

:memo: Nealyang personal blog
1.12k stars 154 forks source link

tsconfig 备忘清单 #136

Open Nealyang opened 6 months ago

Nealyang commented 6 months ago

前言

使用 ts 已多年,但是貌似对于 tsconfig 总是记忆不清,每次都是 cv 历史项目,所以写了这篇备忘录,希望能帮助到大家。

本文总结整理自 Matt Pocock 的一篇文章3,加以个人理解,并做了一些修改。

配置清单

{
  "compilerOptions": {
    /* 基础选项: */
    "esModuleInterop": true,
    "skipLibCheck": true,
    "target": "es2022",
    "allowJs": true,
    "resolveJsonModule": true,
    "moduleResolution": "node",
    "isolatedModules": true,
    "noUnusedLocals": true,
    /* 严格模式 */
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "noImplicitOverride": true,
    /* 使用 tsc 编译: */
    "module": "NodeNext",
    "outDir": "dist",
    "sourceMap": true,
    /* 需要构建成库: */
    "declaration": true,
    /* 需要在 monorepo 中构建成库: */
    "composite": true,
    "declarationMap": true,
    /* 如果不适用 tsc 编译: */
    "module": "preserve",
    "noEmit": true,
    /*  如果需要再浏览器中运行你的代码: */
    "lib": ["es2022", "dom", "dom.iterable"],
    /* 如果你不需要再浏览器中运行你的代码,比如 node: */
    "lib": ["es2022"]
  }
}

完整的配置说明

基础配置

{
  "compilerOptions": {
    "esModuleInterop": true,
    "skipLibCheck": true,
    "target": "es2022",
    "allowJs": true,
    "resolveJsonModule": true,
    "moduleResolution": "node",
    "isolatedModules": true,
    "noUnusedLocals": true
  }
}

比如我们在 ts 中引入 import React from 'react',我们会看到如下报错

alt text

核心是因为 esmdefault 这个概念,而 cjs 没有。任何导出的变量在 cjs 看来都是 module.exports 这个对象上的属性,esmdefault 导出也只是 cjs 上的 module.exports.default 属性而已,而且目前已有的大量的第三方库大多都是用 UMD / cjs 写的(或者说,使用的是他们编译之后的产物,而编译之后的产物一般都为 cjs ),但现在前端代码基本上都是用 esm 来写,所以 esmcjs 需要一套规则来兼容。

详细解释可参见:esModuleInterop 到底做了什么?1

严格模式

{
  "compilerOptions": {
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "noImplicitOverride": true
  }
}
const array: number[] = [];
const value: number | undefined = array[0]; // noUncheckedIndexedAccess -> value有类型number | undefined
class Base {
  greet() {}
}

class Derived extends Base {
  greet() {} // Error! 方法应该有override关键字来标记重写
  override greet() {} // Correct
}

使用 tsc 编译

{
  "compilerOptions": {
    "module": "NodeNext",
    "outDir": "dist"
  }
}

为库构建

{
  "compilerOptions": {
    "declaration": true
  }
}

对于构建 monorepo 的类库 (大型复杂项目同样适用)

{
  "compilerOptions": {
    "declaration": true,
    "composite": true,
    "sourceMap": true,
    "declarationMap": true
  }
}

这是 TypeScript3.0 新增的配置,核心是提供的Project Reference能力,当然,这个不仅仅适用于构建 monorepo 的类库,对于构建单个项目的类库也同样适用。

不适用 tsc 编译

{
  "compilerOptions": {
    "module": "preserve",
    "noEmit": true
  }
}

在 DOM 中运行

{
  "compilerOptions": {
    "lib": ["es2022", "dom", "dom.iterable"]
  }
}

如果不是在 DOM 中运行,那么可以将 lib 选项改为 ["es2022"]即可

常用配置

其他常用配置这里就不说了,包括 includeexcludefilesbaseUrlrootDir

关于上述基本配置,可以从 tsconfig.guide4 中 copy 出来

参考文章