如果一个目录下存在一个tsconfig.json文件,那么它意味着这个目录是TypeScript项目的根目录。
如果你使用 tsc 编译你的项目,并且没有显式地指定配置文件的路径,那么 tsc 则会逐级向上搜索父目录寻找 tsconfig.json ,这个过程类似 node 的模块查找机制。<br />
typeScript 编译器会接受文件或者文件集合作为输入,最终转换为 JavaScript(noEmit 为 false) 和 .d.ts(declarations 为 true)。
tsconfig 的 所有配置 http://json.schemastore.org/tsconfig
tsconfig 的顶层属性(Top Level)
主要有:compilerOptions, files, include, exclude,extends,compileOnSave等。
- compilerOptions 是重头戏,其属性也是最多的,项目也是对这个定制比较多
- files 则是你需要编译的文件
- exclude 则是你不需要编译的文件目录(支持 glob)
- include 是你需要编译的文件目录(支持 glob)
extends 就是继承另外一个配置文件,TypeScript 会对其进行合并,多项目公共配置有用。可以直接继承社区的“最佳实践”,比如:
{"extends": "@tsconfig/node12/tsconfig.json","compilerOptions": {},"include": ["src/**/*"],"exclude": ["node_modules"]}
compileOnSave 则是和编辑器(确切地说是文件系统)联动的配置,即是否在文件保存后进行编译,实际项目不建议使用。
tsconfig 的编译项
文件相关
常用的是以下四个
exclude
- extends
- files
- include
-
严格检查
alwaysStrict 默认:false
这个是和 ECMAScript 规范相关的,工作机制和 ES 5 的严格模式一样, 并且输出的 JS 顶部也会也会带上 ‘use strict’。
noImplicitAny(推荐打开) 默认:true
首次发布版本:-
我在 - TypeScript 类型系统 中提到了如果不对变量显式声明类型,那么 TypeScript 会对变量进行类型推导,这当然也有推导不出的情况,这个时候该变量的类型就是 any,这个叫做隐式 any。区别于显式 any:const a: any = {};
noImplicitThis(推荐打开) 默认:true
和隐式 any 类型, 只不过这次是针对的特殊的一个关键字 this,也就是你需要显式地指定 this 的类型。
strict(推荐打开) 默认:true
实际上 strict 只是一个简写,是多个规则的合集。 类似于 babel 中插件(plugins)和 预设(presets)的差别。换句话说如果你指定了 strict 为 true ,那么所有严格相关的规则的都会开启,另外将来如果增加更多严格规则,你只要开启了 strict 则会自动加进来。
模块解析
模块相关
目的:allowSyntheticDefaultImports,allowUmdGlobalAccess,esModuleInterop,moduleResolution 都是为了和其他模块化规范兼容做的。
allowSyntheticDefaultImports
- allowUmdGlobalAccess
- esModuleInterop
- moduleResolution
还有一个配置 module,规定了项目的模块化方式,选项有 AMD,UMD,commonjs 等。
路径相关
目的: baseUrl,paths,rootDirs, typeRoots,types 都是为了简化路径的拼写做的。
- baseUrl
这个配置是告诉 TypeScript 如何解析模块路径的。比如:
import { helloWorld } from "hello/world";console.log(helloWorld);
这个就会从 baseUrl 下找 hello 目录下的 world 文件。
- paths
定义类似别名的存在,从而简化路径的书写。
- rootDirs
注意是 rootDirs ,而不是 rootDir,也就是说根目录可以有多个。 当你指定了多个根目录的时候, 不同根目录的文件可以像在一个目录下一样互相访问。
实际上也有一个叫 rootDir 的, 和 rootDirs 的区别就是其只能指定一个。
- typeRoots
- types
types 和 typeRoots types 和 @types 是什么?
项目配置
JavaScript 相关
- allowJs 默认:false
顾名思义,允许在 TypeScript 项目中使用 JavaScript,这在从 JavaScript 迁移到 TypeScript 中是非常重要的。
- checkJs 默认:false
和 allowJs 类似, 只不过 checkJs 会额外对 JS 文件进行校验。
声明文件相关
如果 TypeScript 是将 TS 文件编译为 JS,那么声明文件 + JS 文件就可以反推出 TS 文件。
这两个用来生成 .d.ts 和 .d.ts 的 sourcemap 文件。
这个是告诉 TypeScript 如何编译 jsx 语法的。
- lib 默认:-
lib TypeScript 类型系统 中有。 Typescript 提供了诸如 lib.d.ts 等类型库文件。随着 ES 的不断更新, JavaScript 类型和全局变量会逐渐变多。Typescript 也是采用这种 lib 的方式来解决的。
输出相关
outDir 和 outFile 这两个配置则是告诉 TypeScript 将文件生成到哪里。
- outDir 默认:和 ts 文件同目录(且同名,只是后缀不同)
- outFile 默认:-
module 是 CommonJS 和 ES6 module 不能知道 outFile,只有是 None, System 或 AMD 才行,其会将这些模块的文件内容打包到全局文件内容之后。
而 noEmit 则是控制是否输出 JS 文件的。
- noEmit 默认:false
如果你只希望用 TypeScript 进行类型检查,不希望要它生成文件,则可以将 noEmit 设置成 true。
- target
即输出的 JavaScript 对标的 ECMA 规范。 比如 “target”: “es6” 就是将 es6 + 的语法转换为 ES6 的 代码。其选项有 ES3,ES5,ES6 等。
https://www.tslang.cn/docs/handbook/tsconfig-json.html https://lucifer.ren/blog/2020/08/24/ts-config/
