ts基础
ts的作用,
设计思想,不会影响现有的js代码.
无论是浏览器环境,还是node环境,均无法直接识别ts代码,需要编译器将ts代码转化为js代码,方可运行,官方提供的编译器叫做tsc.
npm install -g typescript
安装完成后,通过tsc -v命令来检查是否安装成功
tsc -vVersion 5.9.3
默认情况下,遇到编译错误,编译器依旧会生成js代码,若希望一旦报错就停止编译,可使用--noEmitOnError参数
由于ts的编译参数较多,ts编译器允许将编译参数写在tsconfig.json配置文件中,只要当前目录存在该文件,tsc就会自动读取
基本规则
类型的声明一律为在标识符后添加冒号+类型的方式.函数添加类型约束.
ts规定,变量只有在赋值之后才能使用,否则就会报错.
可是在实际测试过程中,发现并不会报错,这是怎么回事呢?
let a;console.log(a);export { };
这是因为ts对仅声明为赋值的变量采用宽松处理,变量a被推断为any类型,不违反strict规则.
除此之外,ts中还有哪些特殊规定呢?这个问题不能一概而论,这和ts的配置文件息息相关.
在配置文件中开启严格模式之后,相当于开启所有严格检查.
在ts中,冒号之后是类型,
关于ts中的类型,有显示类型,也有隐式类型,
类型推断
类型声明并不是必须的,如果没有,ts会自己推断类型.
隐式类型,是因为ts具有类型推断功能,根据变量的值推断其类型,这时变量只能是某一类型的
如何查看ts对变量的类型推断结果? ts中的类型仅存在于编译时,在运行时会被擦除. 使用typeof在运行时只能检查基本类型.
关于typeof的使用
- 运行时
- 检查基本类型
值与类型 类型只是值的一个元属性,
值的元数据系统是深入理解js语言的关键.
基本数据类型就是单纯的一个值,并不存在元属性,元属性是对象才有的东东,但js有自动装箱功能.
关于类型小写与大写的区别?
原生类型,都是小写的,
首字母大写的类型,是实例类型.
在js中string和String的区别?
string表示基础数据类型,
String表示装箱类型,string对应的String对象
一般优先使用string,除非有特殊用途.
基础类型
联合类型
泛型
元组,长度和类型
ts类型
- any any顾名思义,就是该类型的变量可以被赋予任意类型的值.
any类型的变量,ts会关闭对该变量的类型检查,只要句法正确,就不会报错.
在新项目开发中应该尽量避免使用any,这样就失去了使用typescript的意义.
ts中的类型声明是非必须的,若没有显示为变量指定类型,ts需类型推断类型,若无法推断出类型,就会认为该变量的类型是any
ts提供了一个编译选项--noImplicitAny,打开该选项,只要推断出any类型就会报错.
{"compilerOptions": {"strict": true,// 额外的严格检查"noUnusedLocals": true, // 未使用的局部变量报错"noUnusedParameters": true, // 未使用的参数报错"noImplicitReturns": true, // 函数隐式返回报错"noImplicitAny": true, // 未指定any报错}}
在此有一个例外,如果使用let或var声明了一个变量,但未声明其类型且未进行初始化,直接使用,及时打开noImplicitAny选项依旧不会报错.
由于该原因,建议使用let或var声明变量时,如果不赋值,一定要显示声明类型,否则可能存在安全隐患.
该问题如何解决呢?tsconfig.json是否可以设置变量未赋值就报错呢?
{"noUnusedLocals": true,//检查未使用局部变量}
关于any类型的两个问题:
- ts会关闭对any类型的类型检查
- 由于any类型可以赋值给其他任意类型,所以可能会污染其他变量,从而导致安全隐患.
any类型被称为是ts的逃生舱,应该慎用--在确实需要时才使用,而不是懒惰的解决方案.
unknown类型
为了解决any类型污染其他变量的问题,ts3.0引入了unknown类型,可以视为严格版的any
与any相比,区别在哪? 1.unknown类型的变量,不能直接赋值除any和unknown外的其他类型变量. 2.不能直接调用unknown类型的属性和方法 3.能够进行的运算是有限的,只能进行比较运算符,typeof,instanceof,其他运算都会报错.
上面说到unknown类型不能直接调用属性和方法,哪该如何调用属性和方法呢?答案是只有经过类型缩小后可以使用.
let obj: unknown;obj = { "name": "Tom", age: 20 };if (typeof obj === "object" && obj !== null && "name" in obj) {console.log(obj.name);}
类型检查,类型断言
使用obj instanceof Object时,ts会将unknown类型收窄为object类型
ts类型收窄规则.
ts收窄方式: 1.typeof类型收窄 2.instanceof类型收窄. 3.in操作符 4.等效性收窄 5.联合类型收窄
never类型
空类型的概念,即该类型为空,不包含任何值.
如果一个变量可能有多种类型,如联合类型,剩余的情况就属于never类型.
never类型的一个重要特点就是可以赋值给任意类型.
什么是顶层类型,什么是底层类型.