TypeScript 编译选项、声明文件 | 青训营笔记

102 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2天

TypeScript 介绍

  • TypeScript 是 JavaScript 的超集,提供了 JavaScript 的所有功能,并提供了可选的静态类型、Mixin、类、接口和泛型等特性。

  • TypeScript 的目标是通过其类型系统帮助及早发现错误并提高 JavaScript 开发效率。

  • 通过 TypeScript 编译器或 Babel 转码器转译为 JavaScript 代码,可运行在任何浏览器,任何操作系统。

  • 任何现有的 JavaScript 程序都可以运行在 TypeScript 环境中,并只对其中的 TypeScript 代码进行编译。

  • 在完整保留 JavaScript 运行时行为的基础上,通过引入静态类型定义来提高代码的可维护性,减少可能出现的 bug。

  • 永远不会改变 JavaScript 代码的运行时行为,例如数字除以零等于 Infinity。这意味着,如果将代码从 JavaScript 迁移到 TypeScript ,即使 TypeScript 认为代码有类型错误,也可以保证以相同的方式运行。

  • 对 JavaScript 类型进行了扩展,增加了例如 anyunknownnevervoid

  • 一旦 TypeScript 的编译器完成了检查代码的工作,它就会 擦除 类型以生成最终的“已编译”代码。这意味着一旦代码被编译,生成的普通 JS 代码便没有类型信息。这也意味着 TypeScript 绝不会根据它推断的类型更改程序的 行为。最重要的是,尽管可能会在编译过程中看到类型错误,但类型系统自身与程序如何运行无关。

  • 在较大型的项目中,可以在单独的文件 tsconfig.json 中声明 TypeScript 编译器的配置,并细化地调整其工作方式、严格程度、以及将编译后的文件存储在何处。

编译选项

TypeScript 提供了很多不同功能的编译选项,既可以通过配置 tsconfig.json 文件中的 compilerOptions 属性来实现编译,也可以使用在 tsc 命令后跟随参数这种形式,直接编译 .ts 文件。

以下这些选项可以同时在命令行和 tsconfig.json 里使用。

tsconfig.json

  1. 可以通过 tsc --init 命令在根目录生成 tsconfig.json 文件。
  2. 目录中存在 tsconfig.json 文件表示该目录是 TypeScript 项目的根目录。
  3. tsconfig.json 文件指定编译项目所需的根文件和编译器选项,主要有以下配置项:
{
  "compilerOptions": {},
  "files": [
    "core.ts",
    "index.ts",
    "types.ts"
  ],
  "exclude": [
    "node_modules", 
    "lib", 
    "**/*.test.ts"
  ],
  "include": [
    "src/**/*"
  ],
  "extends": "@tsconfig/recommended/tsconfig.json"
}
复制代码
  • compilerOptions - 对象类型,用来设置编译选项,若不设置则默认使用上述编译选项的默认配置。

  • files - 指定一个包含相对或绝对文件路径的列表,不支持 glob 匹配模式。

  • include - 指定一个文件 glob 匹配模式列表。

  • exclude - 排除一个文件 glob 匹配模式列表。

  • extends - 字符串类型,指向另一个要继承的配置文件的路径。例如,可以继承一个推荐配置 npm i @tsconfig/recommended"extends": "@tsconfig/recommended/tsconfig.json"

    • 如果有同名配置,继承文件里的配置会覆盖源文件里的配置。
    • 配置文件里的相对路径在解析时相对于它所在的文件。

glob 通配符有:

  • * 匹配 0 或多个字符(不包括目录分隔符)
  • ? 匹配一个任意字符(不包括目录分隔符)
  • **/ 递归匹配任意子目录
  • 如果一个 glob 模式里的某部分不包含文件扩展名(只包含 *.*),那么仅有支持的文件扩展名类型被包含在内(默认情况下为 .ts、.tsx 和 .d.ts),如果 allowJs 设置为 true,也包括 .js 和 .jsx。

  • 如果 filesinclude 都没有被指定,编译器默认包含当前目录和子目录下所有的 TypeScript 文件(.ts、.tsx 和 .d.ts),排除在 exclude 里指定的文件。

  • 如果同时指定了 filesinclude,编译器会将它们结合一并包含进来。

  • 使用 include 引入的文件可以使用 exclude 属性过滤。然而,通过 files 属性明确指定的文件却总是会被包含在内,不管 exclude 如何设置。

  • 使用 outDir 指定的目录下的文件永远会被编译器排除,除非明确地使用 files 将其包含进来(这时就算用 exclude 指定也没用)。

  • 如果没有特殊指定,exclude 默认情况下会排除 node_modules、bower_components、jspm_packages 和 outDir 目录。

  • 任何被 filesinclude 指定的文件所引用的文件也会被包含进来。例如,A.ts 引用了 B.ts,因此 B.ts 不能被排除,除非引用它的 A.tsexclude 列表中。

  • 编译器不会去引入那些可能作为输出的文件。例如,我们包含了 index.ts,那么 index.d.tsindex.js 会被排除在外。

  • 优先级:命令行配置 > files > exclude > include