- 编译选项是让我们编译ts变得更优雅、自动,对ts进行一些配置
- 希望ts编译器可以自动监测ts文件的变化,就不用每次修改代码都要重新输一次:tsc tsc文件名.ts命令
tsc 文件名.ts -w (加上-w ts编译器就会自动监视文件变化,并且将变化应用到最新的编译出来的js文件中
但是这个监视只对一个文件监视,如果要监视第二个ts文件,就得再次输入命令开启新的监视窗口
- 直接执行命令:tsc 编译器就会自动把文件夹下的所有ts文件一次性编译完成,但是前提是该文件夹目录下有ts的配置文件tsconfig.json(用来配置ts的一些编译信息,编译器会根据这些信息对ts文件进行编译)

//默认生成的tsconfig.json文件
- 在有配置文件后,执行:tsc -w 命令,就可以同时监视所有目录下的tsc文件
tsfconfig.json文件
- 是ts编译器的配置文件,ts编译器可以根据它的信息来对代码进行编译,可以写注释
- 配置选项(编译相关)
1.include
定义希望被编译文件所在的目录, 指定哪些ts文件需要被编译
默认值:[“/*”]
路径: 表示任意目录, 表示任意文件
// 一个表示任意文件,两个**表示任意目录,根目录下的src目录下的任意目录下的任意文件
2.exclude
指定哪些ts文件不需要被编译,有默认值:如下左图,不写exclude的情况下执行默认值
//表示hello下的文件不需要编译
3.extends
定义被继承的配置文件
当配置文件过于复杂的时候,不想重复写,想继承其他json文件里面的东西
4.files
跟include有点像,include是直接设置文件夹/目录,而files是直接把一个一个要编译的ts文件列出来
5.compilerOptions
作用:决定编译器如何对ts文件进行编译,包含了许多子选项(target、lib、module、outDir……)
1)target:目标,用来指定ts被编译为es版本(默认是es3版本,兼容性比较好,所有浏览器都支持
可以是es3/es5/es6/es2020/ESNext等等
//如果在es3版本,let一个变量,会被编译成var一个变量,而es6则还是let
2)module:模块(原本js是没有模块这个概念,后来对js进行扩展添加增强模块化的功能)
指定要使用哪种模块化的解决方案(规范)
如下图是可选值:
实例:


//如果ts里面没有使用hi,就不会被编译到js 中,在js文件中就是export {};


3)lib:库,用来指定项目中要使用的库,一般情况下不动这个属性,用到哪些库就会根据这些库来检查代码
比如项目中会经常用到第三方的js库:DOM(默认会有)
//表示什么库都没有用
//默认会有dom库,所以不需要写
当项目代码不是在浏览器中运行的时候,是在nodejs里面运行,nodejs是没有DOM,这种情况就可以去修改
如下图是可选值:

4)outDir:指定编译后的js文件所在的目录
5)outFile:输出的文件,将代码合并为一个文件
将编译后的js文件合并到app.js文件中。



//将两个ts文件编译成一个app.js文件
设置outFile后,所有的全局作用域中的代码会合并到同一个js文件中;但如果ts文件中用到了模块化,就合并不了
如果想把多个模块合并成一个文件,模块化modules的值必须得是amd或者system,此时编译就不会报下面的错

6.allowJs:是否对js文件进行编译,默认是false
7.checkJs:是否检查js代码是否符合语法规范,默认是false
//checkJs为true时,就会检查报错
8.removeComments:是否移除注释,默认false。如果true编译之后的注释会被删掉,注释就不会被编译
9.noEmit:不生成编译后的文件,默认值false。设置true后执行tsc命令,执行编译的过程,但最后不会生成js文件
用处:只想用tsc检查一下语法,不想生成编译文件
10.noEmitOnError:当有错误(语法错误……)的时候,设置为ture,不生产编译后的文件。默认flase
- 配置选项(语法相关)
1.alwaysStrict:用来设置编译后的文件是否使用严格模式。默认false,不使用
(严格模式比普通模式在浏览器中执行性能要好一些)
(但如果ts里面有export这些导入引出模块的语句,编译之后js会自动进入严格模式)
//在js文件中,这样开启严格模式。如果alwaysStrict为true,那边编译后的js文件头部就会有“use strict”这样来开启严格模式
2.noImplicitAny:默认值是false,因此当变量/参数不指定类型的时候,默认是any(这就是隐式any,设置为any的话,就会关闭ts所有类型检查)
设置为true的话, 就不允许ts出现隐式的any情况,如果出现就会报错,提醒你要为变量/参数设置类型
3.noImplicitThis:不允许不明确类型的this
函数的this实际上是和函数的调用方式有关
(普通模式下,以函数形式调用:this是window,以方法形式调用:this是调用方法对象)
//此时打印的this实际是不明确的,它的调用方式是不确定,所以用的时候会有风险,因为不确定
这时候就希望ts解析器把这个错误/隐患 检查出来,所以要将noImplicitThis设置为true,就会检查这种隐式this
当设置为true,提示上面的this 出错之后,怎么解决?可以在参数手动指定this为any/window,这样this就可以用了
4.strictNullChecks:严格的检查空值
在js中经常会写一些dom代码
这里会出现一个问题:getElementById会去网页获取元素,但是这时我获取的东西一定存在吗?不确定,那么box1有可能为null,这样box1.addEventListener就有可能会报错,这时候因为strictNullChecks默认值为false,ts编译器不会检查出这个问题
//设置为true后报错
//报错的解决方案1
//方案2
5.strict:所有严格检查的总开关,默认false,如果为true,那么所有的严格检查(如上)都为true,一般写在配置文件最上面
