ts-learnings/00_tsconfig-json.md
2019-04-03 17:26:54 +08:00

215 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# tsconfig.json
[原文](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html): https://www.typescriptlang.org/docs/handbook/tsconfig-json.html
## 概述
某个目录下存在文件`tsconfig.json`那么就表明该目录是某个TypeScript项目的根目录。`tsconfig.json`文件指定了有哪些根文件,以及需要哪些编译器选项来对该项目进行编译。项目是以以下方式之一进行编译的:
## `tsconfig.json`的运用
+ 通过不带有文件的方式调用 `tsc`命令,此时编译器从当前目录开始,进而沿父目录链往上搜索`tsconfig.json`文件by invoking `tsc` with no input files, in which case the compiler searches for the `tsconfig.json` file starting in the current directory and continuing up the parent directory chain
+ 通过不带有文件,但提供用于指定包含了`tsconfig.json`文件的目录路径,或指向某个包含了配置的有效的`.json`文件的`--project`(或仅`-p`)的命令行选项方式,来调用`tsc`命令。
当有在命令行上指定了文件时,`tsconfig.json`文件就会被忽略。
## 示例
`tsconfig.json`的一些示例文件:
+ 使用`files`属性
```json
{
"compilerOptions": {
"module": "commonjs",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"sourceMap": true
},
"files": [
"core.ts",
"sys.ts",
"types.ts",
"scanner.ts",
"parser.ts",
"utilities.ts",
"binder.ts",
"checker.ts",
"emitter.ts",
"program.ts",
"commandLineParser.ts",
"tsc.ts",
"diagnosticInformationMap.generated.ts"
]
}
```
+ 使用`include`与`exclude`属性
```json
{
"compilerOptions": {
"module": "system",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"outFile": "../../built/local/tsc.js",
"sourceMap": true
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules",
"**/*.spec.ts"
]
}
```
## 详解Details
属性`compilerOptions`是可以省略的,在省略了该属性时,编辑器将使用默认选项。请参考完整的[编译器选项](#compiler-options)清单。
`files`属性取的是一个相对或绝对文件路径的清单。而`include`与`exclude`属性则取的是类似于glob的文件模式清单请参考 [Glob_(programming), Wikipedia](https://en.wikipedia.org/wiki/Glob_(programming))[glob介绍](https://www.jianshu.com/p/ce7cf53274bb)。支持以下glob通配符
+ `*` 匹配零个或更多字符(不包含目录分隔符,`*` matches zero or more characters(excluding directory separators)
+ `?` 匹配任意的一个字符(不包含目录分隔符,`?` matches any one character(excluding directory separators)
+ `**/` 递归地匹配所有子目录(`**/` recursively matches any subdirectory
在某个glob模式片段中仅包含了 `*``.*` 时,那么只有那些扩展被支持的文件才被包含进来(也就是`.ts`、`.tsx`与`.d.ts`,而在`allowJs`被设置为`true`的情况下,也包含`.js`与`.jsx`)。
而在`files`与`include`都没有指定时编译器将默认包含其所在目录及子目录下的所有TypeScript文件`.ts`、`.d.ts`与`tsx`),除了那些使用`exclude`属性所排除的文件。同时若`allowJS`被设置为`true`那么JavaScript文集`.js`与`.jsx`)也将包含进来。若有指定`files`与`include`属性则编译器将包含由这两个属性所包含的文件联合the union of the files included by those two properties。在未指定`exclude`属性时,使用编译器选项`outDir`所指定的目录中的文件是排除在外的Files in the directory specified using the `outDir` compiler option are excluded as long as `exclude` property is not specified
使用`include`所包含的文件,可使用`exclude`属性对其进行过滤。但使用`files`属性显式包含的文件,则不会受到`exclude`的影响而总是会包含进来。在莫有指定`exclude`属性时,就默认排除了`node_modules`、`bower_components`、`jspm_packages`以及`<outDir>`这些目录。
那些被`files`或`include`属性包含进来的文件引用到的文件,也将被包含进来。同样,如某个文件`B.ts`被另一个文件`A.ts`引用了,那么除非文件`A.ts`在`exclude`清单中有指明,否则文件`B.ts`也不能被排除在外。
请注意编译器不会将那些可能是输出的文件包含进去;比如在输入中包含了`index.ts`时,那么`index.d.ts`与`index.js`就会被排除在外。总体来说,让多个文件只是在扩展名上有所不同,是不好的做法。
`tsconfig.json`文件可以是空的,那将对默认包含的所有文件,以默认的编译器选项进行编译(跟前面讲到的一样)。
在命令行指定的编译器选项,将覆盖在`tsconfig.json`文件中所指定的那些选项。
## `@types`、`typeRoots`与`types`
默认所有 *可见*`@types` 包在编译中都被包含进去了。任何闭合文件夹的 `node_modules/@types` 里的包,都被视为 *可见*Packages in `node_modules/@types` of any enclosing folder are considered *visible* 具体来说,那意味着在 `./node_modules/@types/`、`../node/modules/@types/`及`../../node_modules/@types/`等处的包。
若指定了 `typeRoots`,那么就 *只有* `typeRoots`下的包将被包含进来了。比如:
```json
{
"compilerOptions": {
"typeRoots": ["./typings"]
}
}
```
此配置文件将包含在 `./typings` 下的 *所有* 包,而不会包含那些 `./node_modules/@types` 下的包了。
在指定了 `types` 属性时,那么就只有所列出的那些包被包含进来。比如:
```typescript
{
"compilerOptions": {
"types" : ["node", "lodash", "express"]
}
}
```
此`tsconfig.json`文件将 *只* 包含 `./node_modules/@types/node`、`./node_modules/@types/lodash`与`./node_modules/@types/express`。其他位处 `./node_modules/@types/*` 的包不会被包含进来。
类型包a types package指的是某个带有名为`index.d.ts`文件的文件夹,或某个有着包含了`types`字段的`package.json`文件的文件夹。
在`tsconfig.json`中指定`types: []`字段,就关闭了`@types`包的自动包含。
请记住只有在使用那些带有全局声明的文件与将文件声明为模块相反自动包含才是重要的keep in mind that automatic inclusion is only important if you're using files with global declarations(as opposed to files declared as modules))。比如在使用一条`import "foo"`语句时TypeScript将在`node_modules`与`node_modules/@types`文件夹中进行查找,以找到`foo`包。
## 使用`extends`配置继承
**Configuration inheritence with `extends`**
通过使用`extends`属性,`tsconfig.json`文件可从其他文件继承到配置。
在`tsconfig.json`中,`extends`属性是一项顶层属性(与`compilerOptions`、`files`、`include`与`exclude`一起)。`extends`的值是一个包含了到要继承的其他文件的路径的字符串。
来自基础文件的配置,将首先载入,随后被继承的配置文件覆盖。如发生了循环继承,编译器将报告错误。
继承配置文件中的`files`、`include`与`exclude`将 *覆盖* 基础配置文件中的对应属性(`files`, `include` and `exclude` from the inheriting config file *overwrite* those from the base config file
在配置文件中找到的所有相对路径,将解析为相对于配置文件原本的位置。
比如:
`configs/base.json`:
```json
{
"compilerOptions": {
"noImplicitAny": true,
"strictNullChecks": true
}
}
```
`tsconfig.json`:
```json
{
"extends": "./config/base",
"files": [
"main.ts",
"supplemental.ts"
]
}
```
`tsconfig.nostrictnull.json`:
```json
{
"extends": "./tsconfig",
"compilerOptions": {
"strictNullChecks": false
}
}
```
## 关于 `compileOnSave` 属性
加入一个顶层的`compileOnSave`告诉IDE在保存时生成给定`tsconfig.json`的所有文件。
```json
{
"compileOnSave": true,
"compilerOptions": {
"noImplicitAny": true
}
}
```
此特性当前已在 Visual Studio 2015 与 TypeScript 1.8.4 以上版本,以及[atom-typescript](https://github.com/TypeStrong/atom-typescript#compile-on-save)插件中得到支持。
## 关于`tsconfig.json`文件的完整结构
**Schema**
可以从 http://json.schemastore.org/tsconfig 查看到。
<a name="compiler-options"></a>
## 编译器选项
| 选项 | 值类型 | 默认值 | 简介 |
| :--- | :----: | :--- | :--- |
| `--allowJs` | `boolean` | `false` | 允许编译JavaScript文件。 |
| `--allowSyntheticDefaultImports` | `boolean` | `module === "system"``--esModuleInterop` | 允许从那些没有默认导出的模块默认导入。此选项不会影响生成的代码,只做类型检查。|
更多编译器选项请参考 https://www.typescriptlang.org/docs/handbook/compiler-options.html